Spring Boot日志系统大揭秘:从零开始学习Spring Boot日志:常见问题解答和最佳实践
一. 关于 Spring Boot 日志的使用
Spring Boot 日志机制和工具用于记录应用程序的日志信息和追踪应用程序的执行过程。它集成了常用的日志框架,如 Log4j、logback、Java Util Logging等,并提供简单易用的配置方式,让开发人员可以方便地监控应用程序的运行状态和性能。在项目启动时,日志已经开始输出,但尚未持久化。下面是一个最简单、最常见的日志示例。

二. 日志的作用
日志是记录应用程序运行状态和运行过程中所发生的事件的一种技术手段。它能够帮助开发人员更容易地追踪和排查问题,同时还可以提高应用程序的安全性、稳定性和可靠性。
在软件开发过程中,日志可以:
1.调试程序:当程序出现问题时,可以查看日志文件以分析问题的原因,从而进行适当的修复。
2.跟踪操作:在应用程序中记录用户操作,以便进行回顾和审计,保证系统安全。
3.监控性能:对于服务器端应用程序,可以记录响应时间、CPU、内存和硬盘使用情况等指标,以便及时发现并解决性能问题。
4.系统运行情况:记录应用程序在不同环境下的运行状态、故障等,以便于开发人员和管理员及时了解系统运行情况,保证系统的稳定性和可靠性。
5.统计数据:将日志文件作为数据来源,进行统计分析,以便了解用户行为、访问量等信息,从而进行决策和规划。
总而言之,日志是一种非常重要的技术手段,它能够帮助开发人员更好地维护应用程序、改进用户体验和提高应用程序的稳定性和可靠性。从上面的 Spring Boot 项目启动日志可以看出,启动过程中打印了一些信息,其中包括 BUG 等级和端口号等。然而,这些仅仅是启动日志的一小部分,实际上日志还能记录更多的信息。
记录登陆日志, 利于分析用户是否正常登陆, 防止其恶意攻击破解用户倘若我们记录用户的登陆日志,就能利用用户登陆的频率、输入次数、地理位置等信息,对其进行分析以判断是否存在异地风险登陆、多次暴力破解等异常情况。
记录系统的操作日志, 方便数据恢复和定位操作比如一个医院的病历系统,记录每位患者的就诊情况、诊断结果、治疗方案等信息。当医生误诊或操作失误时,比如开错药、做错手术等,可以根据系统的操作日志进行回滚操作,及时发现问题并进行纠正。同时,系统还可以记录每位医生的操作记录,便于管理人员进行追责和改进工作。
记录系统执行时间, 方便优化程序做数据支撑记录一个程序开始时间, 在结束时也记录一下时间, 从而可以获取到该程序的执行时间. 执行时间过长, 那么需要考虑去如何优化它.
当然, 除了上面列举的一些作用, 日志还有其他重要用途, 大家可以自行探索
三.如何使用日志
对于 Spring Boot 中, 它内置了 SLF4J 框架, 可以直接在程序中进行调用 SLF4J 来打印日志, 并且日志一个门面模式, 何为门面模式呢?
在这举例来说就像找房子一样, SLF4J 在这就充当了这个房屋中介的作用, 而它手下不同房子就是它的实现. 例如大平层( Log4j ) 、小洋房(logback ) 、海景别墅( Java Util Logging ). 某一天你需要租一个房子来装你得东西, 你就去找房屋中介, 房屋中介就会给你介绍上面的几种房屋类型, 你可以自己进行选择. 比如你选择了大平层, 你住腻了可以换一个通过中介在海景别墅, 这样你就可以省去找房子的时间, 想更换只需要通过中介进行更换就可以了
带入到我们的日志中, 中介就是日志的门面, 中介控制的房子就是日志的实现 , 这样有什么好处呢 ? 我们不再需要去关注门面, 托管给别人帮我们做了,只需要去看喜欢那个房子( 用什么日志方式去输出就行 ) 有一天住腻了 ( 这个日志方式出了问题 ) 就可以快速的通过中介在换一个房子( 换一个日志方式 )
, 避免在没有地方可以去( 你所有的日志都用的这个方法去控制, 没有中介那你想要换个房子就需要很长时间去修改 )
了解了日志得门面模式以后, 接下来看看如何自定义实现也给日志
1. 得到日志对象
注意级别根据上述系统日志的启动记录可以发现,所有日志信息都属于同一类别,因此所获取的日志对象必定为类级别的日志对象,而非仅在某个具体方法中实现的方法级别对象。

注意作用域启动系统日志后,每个日志都会带有其位置信息,即可以清晰看到其所在的包和类名。因此,为避免日志位置混乱,日志对象必须私有化,只能在该类内使用,而不能在其他类中使用。

注意框架的选择由于我们在使用 SLF4J 作为门面模式时, 去创建日志对象需要通过门面去调用具体的实现方式, 因此创建日志对象时应当选择 SLF4J 下的 Logger

综上, 最终通过 SLF4J 的 Logger 创建一个 log 对象, 并通过提供的日志工程去调用 getLogger ( 因为是类级别的, 因此此处选择类 的 getLogger 方法 )成功创建一个日志对象


2. 使用 log 对象**
访问路由后在控制台可以看到如下信息 :
PS : 日志信息打印此处和你们默认的不一样, 我在配置文件中设置了默认等级为 debug, 日志系统默认等级为 info, 下面会说这个问题,
此处只关注日志对象输出日志有哪些内容即可

时间信息、日志等级信息、日志位置信息、日志内容信息. 可以说是非常的齐全日志
四. 日志等级
日志等级用于指示日志消息的重要性或严重程度,开发人员可以设置日志级别以过滤掉不必要的日志消息,同时也可以根据日志级别快速定位和解决日志问题。
常见的日志等级包括:
1.DEBUG:用于调试或开发阶段,产生大量日志;
2.INFO:提示性消息,用于标记应用程序的主要分支和进度;
3.WARN:警告性消息,用于提示可能会导致程序问题或潜在错误的情况;
4.ERROR:标记错误事件,用于记录程序中的错误;
5.FATAL:严重错误,可能导致程序崩溃或无法工作,是最高级别的日志等级。
当设置日志级别时,高级别的日志消息也会同时输出更低级别的所有日志消息,例如设置日志级别为WARN将输出所有的WARN、ERROR和FATAL日志消息。
总之,日志等级是日志记录中非常重要的一个概念,它可以帮助开发人员精确排查和调试日志问题,提高应用程序的可维护性和可读性。
1.trace : 微量级别, 级别最低
2.debug : 需要调试的时候使用, 调试级别
3.info : 普通的打印信息 ( 日志默认的级别 )
4.warn : 警告, 不影响使用, 但是需要注意的问题
4.error : 错误信息, 级别比较高的错误日志信息
6.fatal : 致命的, 因代码异常导致程序执行退出的事件上面就是日志的级别, 但是我们能够操作的日志级别只有前五个, 最后一个致命的日志级别是无法操控的, 当程序错误退出的时候, 系统会自动帮我们打印fatal 级别的日志信息.
从上之下, 级别是越来越高的, 越往下接收的消息越少, 遵守一个原则低级别的无法查看高级别的


可以看到, 只能查看到 info、warn 和 error 级别的错误信息, 而 trace 和 debug 是无法查看的, 这是为什么呢 ?当我们把 info 注销掉在看看

可以看到, 只有 info 不见了, 在把 warn 和 error 注释掉看看

此时没有任何日志信息, 可以得到结论 日志的默认等级是 info, 哪当我们想查看 trace 和 debug 的日志信息怎么办呢 ?
毕竟调试日志对于写程序来说是很重要的, 可以定位问题所在 , 下面就介绍一下 Spring Boot 中项目中日志的等级设置
五. 日志级别设定
开发人员可以根据实际需要设置日志级别,从而控制日志输出的内容。通常来说,开发人员应该将日志级别设置为INFO或者以上级别,避免输出过多无用信息。同时,可以根据实际情况将日志级别调整为更高或更低级别,以满足具体的需求。
日志级别的设定是优化日志输出的关键。在开发过程中,合理设定日志级别可以帮助开发人员快速定位、解决程序中的问题。因此,开发人员需要根据实际需求,合理设置日志级别。在 properties 配置文件中,可以使用以下代码来设置日志等级:
# 设置日志记录级别
log4j.rootLogger=INFO
其中,log4j.rootLogger 表示根日志记录器,INFO 表示记录 INFO 级别及以上的日志信息。如果需要记录更详细的日志,可以将 INFO 换成 DEBUG 或 TRACE。
另外,也可以针对特定的包或类进行日志等级的设置,如下所示:
log4j.logger.com.example=DEBUG
其中,com.example 表示需要设置日志等级的包或类名,DEBUG 表示记录 DEBUG 级别及以上的日志信息。或者在配置文件中设定日志级别:完成配置后,我们需要使用 log 方法对程序执行过程中的信息进行记录。在进行观察之前,建议首先打印一下 log 信息,以便了解程序在执行时的日志情况。根据配置文件中的设置,我们可以看到由于默认等级是 debug,因此程序执行过程中 debug 等级的错误日志信息可以被记录下来。然而,如果想查看比 debug 更低等级的trace级别的日志信息的话,就需要将日志等级设置为 trace 了。
另外, 配置文件中除了 root(根记录器 ) 设置为日志等级外, 还有更加详细的日志等级设置, 为特定的包设置日志等级 ,
例如下面这个配置文件中, 设置 com.example 包下的类日志等级为 info, 而 com.example.demo 包下的日志等级为 debug

六. 日志的存储
日志作为记录系统运行状态和问题的重要组成部分,其存储方式至关重要。为了保证系统日志的完整性和可靠性,需要采用合适的存储方式,通常包括以下几种:
1.文件存储:将日志记录到文件中,便于查阅和分析。可以按照时间、事件等方式进行分类保存,也可以对日志进行压缩和归档处理。
2.数据库存储:将日志记录到数据库中,可以方便的进行查询、分析和统计处理。同时还可以利用数据库的事务机制保证数据的一致性和完整性。
3.日志聚合:将多个日志源的信息聚合到一起,形成一个整体的日志记录。通过对这些日志进行统计和分析,可快速定位问题和进行优化。
不同的存储方式各有优劣,需要根据具体的需求和场景选择合适的方案。无论采用何种方式,都要注意日志的保密性和安全性,在存储和传输过程中采取相应的加密和认证措施,避免信息泄露和攻击。当然, 日志如此重要不仅仅是因为它可以定位问题, 更重要的时候它可以作为数据分析, 想要数据分析肯定不能通过控制台 sout 的方式打印日志,
下次启动就没有了, 因此就必须将日志进行持久化, 下面就来实现日志的持久化操作
在 yml 配置文件中设置. 设置文件路径, 文件的名称可以不写( 写了生成的就是你设置的名称 ), 会自动生成一个名为 spring.log 的文件

再去运行刚刚的 log 方法, 此时在我刚刚的保存路径底下就生成了这样一个 spring.log 文件

当我重复去访问这个方法时, 它会重复打印日志, 我们来看看会不会覆盖

事实上, 它是不会覆盖的, 如果真的覆盖了那才是出大问题了 !
PS 1 : 在文件的保存路径设置中, 如果没有设置路径, 它会在项目底下生成一个你设置的名称的文件

PS 2 : 在官网中可以看到说明, 当日志文件超过 10MB 大小时, 它会将你后续得日志文件保存在一个新的文件中(
并且它会按照自己的命名规则替你命名和分割日志 ), 但是这个日志文件的大小也是可以去设置的 # 七. 使用Lombok简化日志记录
Lombok是一个Java库,通过注解实现了简化Java代码的编写,包括简化日志记录的编写。在Java应用程序中,日志记录是非常重要的,但是传统的Java日志记录方式通常需要编写大量的冗余代码。Lombok的日志相关注解可以让我们轻松地实现日志记录功能,大大减少了代码量。下面将介绍如何使用Lombok简化日志记录。
1. 添加依赖
首先需要在项目中添加Lombok依赖,具体方式可以在项目的pom.xml文件中添加以下代码:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
2. 使用注解
使用Lombok实现日志记录功能非常简单,只需要使用@Slf4j注解即可,如下所示:
import lombok.extern.slf4j.Slf4j;@Slf4j
public class TestLog {public static void main(String[] args) {log.debug("debug message");log.info("info message");log.warn("warn message");log.error("error message");}
}
@Slf4j注解实际上会自动为我们生成一个名为log的静态变量,在代码中可以直接使用log对象输出日志信息。当然,我们也可以手动定义日志对象,如下所示:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class TestLog {private static final Logger LOGGER = LoggerFactory.getLogger(TestLog.class);public static void main(String[] args) {LOGGER.debug("debug message");LOGGER.info("info message");LOGGER.warn("warn message");LOGGER.error("error message");}
}
这里采用了传统的Java日志记录方式,不过使用了Lombok简化变量定义的代码量。
3. 注意事项
在使用Lombok进行日志记录时,需要注意以下几点:
1.需要在项目中正确添加Lombok依赖。
2.在使用Lombok的@Slf4j注解时,需要保证项目中至少引入了一种日志框架。
3.在使用Lombok的@Data注解时,需要特别注意成员变量的访问权限,避免数据泄露问题。
4. 总结
Lombok的日志相关注解能够很好地简化Java代码的编写,特别是对于Java应用程序中频繁使用的日志记录功能,使用Lombok可以大大减少代码量和开发时间,提高开发效率。在使用Lombok进行日志记录时,需要注意Lombok的使用约定和注意事项,避免引入不必要的麻烦。可以发现,在不同类中实现日志输出时,都需要手动创建日志对象并修改getLogger方法中的类对象,这样操作有些繁琐。因此,lombok提供了一种更加简便的方式来实现日志输出。这个步骤比较简单,只需要手动添加 lombok 依赖即可。2. 增加 @slf4j 注解

除了 @slf4j 注解, lombok 还提供许多其他的注解, 您可以前往官网进行查看.
关于Spring Boot的文章就分享到这里,另外给大家准备了两个关于【Spring Boot入门到精通】以及【手写Spring Boot源码实现】两套非常干货的笔记,有需要的可以看文章末尾免费领取!


相关文章:
Spring Boot日志系统大揭秘:从零开始学习Spring Boot日志:常见问题解答和最佳实践
一. 关于 Spring Boot 日志的使用 Spring Boot 日志机制和工具用于记录应用程序的日志信息和追踪应用程序的执行过程。它集成了常用的日志框架,如 Log4j、logback、Java Util Logging等,并提供简单易用的配置方式,让开发人员可以方便地监控应…...
【06】Nginx之反向代理
Nginx反向代理的配置语法 Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析 proxy_pass 该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。 语法proxy_pass URL;默认值—位置location URL:为要设置的被代理服务器地址…...
TCP是面向字节流的协议
TCP字节流 之所以会说 TCP 是面向字节流的协议,UDP 是面向报文的协议,是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同,也就是问题原因在发送方。 为什么 UDP 是面向报文的协议? 当用户消息通过 UDP 协议传输时,…...
读书笔记——《when breath becomes air》《超越自卑》
为啥要两本书一起写读后感? 读完这两本书本来应该分开来写点东西的,不过我认为这两本书应该写不了太多内容。虽然我也看了几本英文原著(也写了点东西),但是我明显低估了《when breath becomes air》的难度,…...
CMD与DOS脚本编程【第二章】
预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数,如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介…...
面试字节,过关斩将直接干到 3 面,结果被吊打了?
人人都有大厂梦,对于软件测试员来说,BAT 为首的一线互联网公司肯定是自己的心仪对象,毕竟能到这些大厂工作,不仅薪资高待遇好,而且能力技术都能够得到提升,最关键的是还能够给自己镀上一层金,让…...
OpenCV在iOS端的集成及Mat和UIImage互相转化(附源码)
OpenCV是一个非常强大的图形处理框架,可以运行在Linux、Windows、Android和Mac OS操作系统上,在自动驾驶、智能家居、人脸识别、图片处理等方面提供了非常丰富且功能强大的api,在图片处理方便,基本上可以满足对图片处理的所有需求…...
5月跳槽会有风险,不跳也会有?
今天讲讲跳槽。 说实话跳槽是为了寻求更好的发展,但在跳槽前我们也不能确定下家就是更好的归宿,这就更加需要我们审慎地去对待,不能盲目跳槽。 其次,我们离职和跳槽,其中的原因很大一部分是目前薪资不符合预期。 那…...
【小白版】最简单的 goland package 教程包括自定义包的使用
一、Hello World 最简单的教程,就需要从最简单的事情开始说起: mkdir myappcd myappgo mod init myapp // myapp是主项目名 这行命令将生成一个go.mod文件,这个文件会记录所有的包的依赖关系,一个空的go.mod只有项目名称和go版本…...
IMX6ULL的I2C驱动详细分析
IMX6ULL的I2C驱动详细分析 文章目录 IMX6ULL的I2C驱动详细分析i2c_imx_driver 的平台驱动注册i2c_imx_probe注册函数i2c_imx_algoI2C算法结构体i2c_imx_start开始I2Ci2c_imx_stop停止I2Ci2c_imx_isr中断服务函数i2c_imx_dma_writeDMA 进行写操作的 I2C 传输2c_imx_dma_readi2c_…...
日志迁移到 logback
目标 本次迁移的目标就是用 slf4jlogback 的日志框架来取代目前的 slf4jlog4j 如何迁移 基于 slf4j 的无痛迁移 项目本身是采用的 slf4jlog4j 日志架构,所以迁移到 logback 基本无痛 修改依赖 原本是 slf4jlog4,依赖如下 <dependency><gro…...
开源字节 CRM 系统
开源字节CRM是一款SaaS模式的客户关系管理软件,基于钉钉平台进行研发,以客户管理为核心,包含客户管理、销售全流程管理,合同订单、工单管理、移动审批、数据分析六大模块。 旨在助力企业销售全流程精细化、数字化管理,…...
七、Spring Cloud Alibaba-Sentinel
一、引言 1、了解服务可用性问题,服务挂掉原因 缓存击穿、单点故障、流量激增、线程池爆满、CPU飙升、DB超时、缺乏容错机制或保护机制、负载不均、服务雪崩、异常没处理等。 服务雪崩效应:因服务提供者的不可用导致服务调用者的不可用,并将…...
机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化
什么是knn算法? KNN算法是一种基于实例的机器学习算法,其全称为K-最近邻算法(K-Nearest Neighbors Algorithm)。它是一种简单但非常有效的分类和回归算法。 该算法的基本思想是:对于一个新的输入样本,通过…...
【MySQL】MySQL基础知识详解
文章目录 1. MySQL概述1.1 数据库相关概念1.1.1 数据库、数据库管理系统与SQL1.1.2 关系型数据库与数据模型 1.2 MySQL数据库1.2.1 MySQL的安装与配置1.2.2 MySQL服务的启动与停止1.2.3 连接MySQL服务端 2. SQL2.1 SQL简介2.2 DDL2.2.1 数据库操作2.2.2 表操作2.2.2.1 创建表2.…...
RabbitMQ日常使用小结
一、使用场景 削峰、解耦、异步。 基于AMQP(高级消息队列协议)协议来统一数据交互,通过channel(网络信道)传递信息。erlang语言开发,并发量12000,支持持久化,稳定性好,集群不支持动态扩展。 RabbitMQ的基本概念 二、组成及工作流…...
博物馆文物馆藏环境空气质量无线监控系统方案
博物馆文物馆藏环境空气质量无线监控系统方案 博物馆无线环境测控系统 博物馆恒温恒湿消毒净化系统 现代化博物馆空气质量一体化3D可视化管控平台 博物馆温湿度在线监控系统 博物馆光照在线监控系统 博物馆二氧化碳在线监控系统 博物馆在线监控系统 博物馆紫外线在线监控…...
测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类
【原文链接】测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类 一、Bug的严重程度(Severity) Bug的Severity(严重程度)指的是一个Bug对软件系统功能影响的程度&#…...
斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名
由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动,现已接受优秀项目提交参赛申请。 在加密行业发展早期,密码极客们就始终在对区块链世界基础设施,在发展方向的无限可能性进行探索。而…...
00后卷王,把我们这些老油条卷的辞职信都写好了........
现在的小年轻真的卷得过分了。 前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
