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

Spring Boot 日志体系全面解析:从 SLF4J 到 Logback、Log4j2 与 Lombok 超详细!!

目录

一、概念与作用

二、日志门面与日志实现

1. 日志门面(Logging Facade)

2. 日志实现

三、SLF4J 与参数化日志的最佳实践

基本用法:

推荐使用参数化日志(占位符方式):

四、Lombok 的 @Slf4j 注解:简化日志代码

使用方式:

原理:

五、Logback 与 Log4j2

1. Logback(Spring Boot 默认)

2. Log4j2

切换为 Log4j2 的步骤:

六、日志配置与输出:控制台、文件与滚动策略

1. 输出到控制台

2. 输出到文件

3. 按时间或大小滚动日志文件

七、日志在项目中的实际应用场景

1. 业务日志

2. 异常日志

3. 调试日志

4. 定时任务与批处理日志

八、部署环境中的日志查看与排查

常用日志查看命令:


一、概念与作用

日志是程序运行过程中产生的记录信息,用于描述程序的执行状态、业务流程、异常情况等。其主要作用包括:

  • 开发调试​:在开发阶段输出关键流程信息,辅助问题定位;
  • 运行监控​:记录系统运行状态,便于监控和审计;
  • 故障排查​:线上出现问题时,通过日志快速定位异常或错误;
  • 行为审计​:记录关键业务操作,满足合规与安全需求。

二、日志门面与日志实现

Java 的日志体系通常分为两个层次:

1. 日志门面(Logging Facade)

日志门面是日志的抽象层,提供统一的日志 API,常见的有:

  • SLF4J​​:目前最主流的日志门面,Spring Boot 默认使用,支持多种日志实现,强调解耦和标准化。

开发者应面向日志门面编程,避免直接依赖某个具体的日志实现,提高代码的可移植性和灵活性。

2. 日志实现

日志实现是真正负责日志输出的部分,常见的有:

  • Logback​:SLF4J 的“原生”实现,由 Log4j 创始人开发,性能优秀、功能完备,是 Spring Boot 默认集成的日志框架。
  • Log4j2​:Apache 提供的新一代日志框架,相比 Logback 性能更高,支持异步日志、插件机制等高级特性,适合高并发、高性能场景。
  • java.util.logging (JUL)​​:JDK 自带的日志框架,功能相对简单,一般不推荐在项目中使用。
  • Log4j 1.x​:已停止维护,存在已知安全问题,不应再使用。

现在一般都使用默认的Logback或者功能更多的Log4j2


三、SLF4J 与参数化日志的最佳实践

SLF4J 定义了一套标准的日志 API,最常见的用法是通过 LoggerFactory获取 Logger对象,然后调用如 info()error()等方法输出日志。

基本用法:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public void doSomething() {logger.info("这是一条信息日志");logger.error("这是一条错误日志", exception);}
}

推荐使用参数化日志(占位符方式):

logger.info("用户 {} 登录成功,登录时间 {}", username, loginTime);

优势:​

  • 性能更好​:当日志级别低于当前配置时(如配置为 WARN,但代码中为 INFO),不会执行字符串拼接;
  • 可读性更强​:分离固定文本与变量,便于理解和维护;
  • 更安全​:避免因拼接特殊字符导致日志格式错乱;
  • 更灵活​:支持多个变量,按顺序匹配占位符 {}

不推荐的写法(字符串拼接):​

logger.info("用户" + username + "登录成功,登录时间" + loginTime);

四、Lombok 的 @Slf4j 注解:简化日志代码

Lombok 是一个 Java 编译期注解处理器,通过注解自动生成代码,以减少样板代码。@Slf4j是其中的一个常用注解,用于自动生成日志对象。

使用方式:

import lombok.extern.slf4j.Slf4j;@Slf4j
public class MyClass {public void doSomething() {log.info("这是一条信息日志");log.error("这是一条错误日志");}
}

原理:

Lombok 在编译时自动为当前类生成如下代码,就不用自己写了:

private static final Logger log = LoggerFactory.getLogger(MyClass.class);

优势:​

  • 减少重复代码,提升开发效率;
  • 避免手动编写 Logger对象时可能出现的类名错误;
  • 保持代码整洁与一致性。

前提条件:​

  • 项目中引入 Lombok 依赖;
  • IDE 安装 Lombok 插件并开启注解处理;
  • 使用 @Slf4j后,直接使用自动生成的 log对象即可。

lombok注解还有很多别的作用,可以看我主页专门介绍lombok那篇博客。


五、Logback 与 Log4j2

Spring Boot 默认使用 ​Logback​ 作为日志实现,但开发者可以根据需求切换为 ​Log4j2,以获得更高的性能和更丰富的功能。

1. Logback(Spring Boot 默认)

  • 特点​:与 SLF4J 无缝集成,配置灵活,支持多种 Appender(控制台、文件、滚动策略等);
  • 配置文件​:通常为 logback-spring.xmllogback.xml,放在 src/main/resources/目录下;
  • 适用场景​:大部分 Spring Boot 项目,功能足够且稳定。

2. Log4j2

  • 特点​:性能优于 Logback,支持异步日志、插件扩展、灵活的配置和过滤器;
  • 配置文件​:通常为 log4j2.xmllog4j2-spring.xml
  • 使用方法​:
    • 排除默认的 spring-boot-starter-logging(即 Logback);
    • 引入 spring-boot-starter-log4j2
    • 添加并配置 log4j2.xml文件。

切换为 Log4j2 的步骤:

步骤

操作内容

1

排除默认的 Logback 依赖​:在 spring-boot-starter-web(或其他 starter)中排除 spring-boot-starter-logging

2

引入 Log4j2 Starter​:添加 spring-boot-starter-log4j2依赖

3

添加 Log4j2 配置文件​:如 log4j2-spring.xml,放在 src/main/resources/下,配置日志输出格式、级别、目标(控制台/文件)、滚动策略等

4

验证是否切换成功​:启动项目,观察日志行为和启动日志提示,确认使用的是 Log4j2

5

​(可选)优化配置​:按天分割日志、设置日志级别、输出到固定目录、适配 Docker 等生产环境需求

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

六、日志配置与输出:控制台、文件与滚动策略

无论使用 Logback 还是 Log4j2,都可以通过配置文件指定日志的输出目标与格式,常见配置包括:

1. 输出到控制台

适用于开发环境,方便实时查看日志。

2. 输出到文件

适用于生产环境,将日志持久化存储,便于后续分析与排查。

示例(Log4j2 配置文件中定义文件输出):

<File name="File" fileName="logs/app.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</File>

3. 按时间或大小滚动日志文件

生产环境中,单个日志文件会不断增大,推荐使用 ​滚动策略,按时间(如每天)或文件大小分割日志,并自动归档旧日志。

Log4j2 提供 RollingFileAppender,Logback 提供 TimeBasedRollingPolicy等机制,可实现:

  • 按天分割日志文件,如 app-2024-06-15.log
  • 限制单个日志文件大小,如 10MB;
  • 设置保留的历史日志文件数量;
  • 压缩归档旧日志以节省空间。

七、日志在项目中的实际应用场景

1. 业务日志

在业务代码中记录关键操作、流程状态、参数信息等,例如:

log.info("flightListPushPerHour res={}, type={}, dateStr={}", result, lockType, dateStr);

此类日志通常包含:

  • 任务或方法名称;
  • 执行结果(成功/失败);
  • 失败原因或类型;
  • 数据标识(如日期、用户 ID、请求 ID 等)。

2. 异常日志

在捕获异常时,记录错误信息和堆栈,便于排查问题:

log.error("航班推送失败,dateStr={}", dateStr, e);

3. 调试日志

使用 log.debug(...)输出调试信息,通常仅在开发或测试环境开启,生产环境关闭。

4. 定时任务与批处理日志

对于定时任务、批量数据处理等场景,建议记录任务开始、结束、处理条数、异常情况等,便于监控与排查。


八、部署环境中的日志查看与排查

在服务器或容器中部署应用后,日志通常会输出到指定的日志文件中(如 /var/log/myapp/app.log或项目目录下的 logs/app.log)。

常用日志查看命令:

  • 实时查看日志内容:​
    tail -f /path/to/app.log
  • 查看日志文件末尾内容:​
    tail -n 100 /path/to/app.log
  • 结合 grep 过滤关键字:​
    grep "ERROR" /path/to/app.log

通过实时查看日志,开发者可以快速定位线上问题,监控系统运行状态。

主题

核心内容

日志的作用

开发调试、运行监控、故障排查、行为审计

日志体系分层

日志门面(如 SLF4J) + 日志实现(如 Logback、Log4j2)

推荐实践

面向 SLF4J 编程,使用参数化日志,避免字符串拼接

Lombok 支持

使用 @Slf4j注解简化日志对象创建,提升代码简洁性

日志实现选择

Spring Boot 默认使用 Logback,可切换为 Log4j2 以获得更高性能

日志配置

通过 logback-spring.xmllog4j2.xml配置输出目标、格式与滚动策略

生产环境建议

日志输出到文件,结合滚动与归档策略,使用 tail等命令实时查看


文章转载自:

http://D7tOoc0s.gcdzp.cn
http://wMSiFb4L.gcdzp.cn
http://FAsDzwHo.gcdzp.cn
http://pYtpDEOl.gcdzp.cn
http://7OpGZonA.gcdzp.cn
http://8IRUzMVB.gcdzp.cn
http://zJ0hns7A.gcdzp.cn
http://I12ympdu.gcdzp.cn
http://5GazP22P.gcdzp.cn
http://dDJgZ3JK.gcdzp.cn
http://GweFgyqP.gcdzp.cn
http://ygzkMGYC.gcdzp.cn
http://5KAzbuRp.gcdzp.cn
http://6qL2zvMA.gcdzp.cn
http://vGa4XUgD.gcdzp.cn
http://L2Niq8rJ.gcdzp.cn
http://2bBKYK4m.gcdzp.cn
http://qBEvScZw.gcdzp.cn
http://IWbIklsB.gcdzp.cn
http://joTj6PiZ.gcdzp.cn
http://pZhLbSLF.gcdzp.cn
http://o0xOM3R2.gcdzp.cn
http://1v26faoQ.gcdzp.cn
http://xZdYteaw.gcdzp.cn
http://PXzS8e1N.gcdzp.cn
http://q5hZGZqX.gcdzp.cn
http://8hoEBCMS.gcdzp.cn
http://OYtPSzlz.gcdzp.cn
http://cKAFsW7n.gcdzp.cn
http://7CmpeyTI.gcdzp.cn
http://www.dtcms.com/a/384338.html

相关文章:

  • springboot创建请求处理
  • 08-Redis 字符串类型全解析:从命令实操到业务场景落地
  • 学习海康VisionMaster之字符缺陷检测
  • CAD画图:002软件界面操作
  • 解锁全球业务潜能:AWS全球网络加速解决方案深度解析
  • HTTPS Everywhere 是什么?HTTPS 插件作用、iOS 抓包失败原因解析与常见抓包工具对比
  • 【C++】STL详解(七)—stack和queue的介绍及使用
  • 20250912在荣品RD-RK3588-MID开发板的Android13系统下拿掉卡迪屏的reset引脚的下拉复位波形
  • 在线图书借阅平台的设计与实现 —— 基于飞算JavaAI的实战开发全流程与优化实践
  • Git : 分支管理和远程仓库
  • 当传统金融遇上AI智能:AIStock系统深度技术解析
  • 大数据如何捕捉你的爱好?如何实现跨站用户行为分析?
  • 用OpenCV CSRT实现实时目标跟踪
  • 13.Linux OpenSSH 服务管理
  • 微算法科技(NASDAQ: MLGO)研发基于量子密钥图像的量子图像加密算法,提供更高安全性的图像保护方案
  • LAMP 环境部署
  • Java程序设计:Eclipse 安装和使用
  • ZooKeeper 集群高可用配置指南
  • 在天嵌 TQ3568 (Debian) 上配置并添加打印机教程
  • pcl封装10 get_area_form_boundary计算平面点云面积
  • 突破局域网限制:MongoDB远程管理新体验
  • C++学习:map/set源码剖析+利用红黑树封装map/set
  • HTML开发工具有哪些?常用HTML编辑器推荐、HTML开发工具对比与HTML调试工具实战应用
  • Redis篇章3:Redis 企业级缓存难题全解--预热、雪崩、击穿、穿透一网打尽
  • 什么区块链(Blockchain)?Rust的区块链的例子
  • LangChain4J-(5)-记忆缓存与持久化
  • 遇到 npm install报错 certificate has expired是因为淘宝镜像源(registry.npm.taobao.org)
  • Excel办公新选择:300项功能的免费插件
  • 在Excel和WPS表格中用照相机创建动态更新的数据图片
  • 开发与维护nodejs工具库或自定义npm包