Spring Boot 使用 SLF4J 进行日志记录

简介: 本课讲解Java开发中日志的最佳实践,摒弃System.out.println(),采用SLF4J+Logback方案。涵盖日志级别、配置文件编写、格式化输出与滚动策略,提升系统可观测性与维护效率。

在 Java 开发中,我们常常看到初学者使用 System.out.println() 打印调试信息。虽然简单直接,但这种方式存在严重问题:

  • ❌ 无法控制输出级别(如只看错误日志);
  • ❌ 无法将日志写入文件;
  • ❌ 性能差,大量输出会拖慢应用;
  • ❌ 无法格式化、归档、轮转。

✅ 正确做法是:使用专业的日志框架。在 Spring Boot 项目中,SLF4J + Logback 是官方推荐、性能优异、功能强大的组合。

本节课将带你掌握:

  • 什么是 SLF4J 及其优势;
  • 如何在 Spring Boot 中配置日志;
  • 编写 logback.xml 实现日志分级、文件滚动、格式定制;
  • 在代码中正确使用 Logger 打印日志。

1. 为什么选择 SLF4J?

1.1 SLF4J 是什么?

SLF4J(Simple Logging Facade for Java) 是一个日志门面(Facade),它不负责实际的日志输出,而是提供统一的 API 接口,背后可以对接 Logback、Log4j、java.util.logging 等具体实现。

就像 JDBC 是数据库访问的门面一样,SLF4J 是日志系统的“通用接口”。

1.2 核心优势

优势 说明
解耦日志实现 切换日志框架(如从 Log4j 换成 Logback)只需改依赖,无需修改代码
占位符支持 logger.info("用户 {} 登录成功", username),避免字符串拼接开销
级别判断优化 自动判断日志级别是否启用,避免无谓的对象创建
阿里规约强制要求 《阿里巴巴 Java 开发手册》明确要求:禁止直接使用 Log4j/Logback API,必须通过 SLF4J

📌 结论SLF4J 是企业级项目的标准选择


2. 在代码中使用 Logger

使用方式非常简单:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class TestController {
    // 1. 获取 Logger 实例(类名作为 logger 名)
    private static final Logger logger = LoggerFactory.getLogger(TestController.class);
    @GetMapping("/log")
    public String testLog() {
        // 2. 按不同级别打印日志
        logger.debug("调试信息:用户正在访问 /log");
        logger.info("普通信息:请求已接收");
        logger.warn("警告信息:参数可能不完整");
        logger.error("错误信息:数据库连接失败");
        // 3. 使用占位符(推荐!避免字符串拼接)
        String blog1 = "blog.itcodai.com";
        String blog2 = "blog.csdn.net/eson_15";
        logger.info("倪升武的博客:{};CSDN:{}", blog1, blog2);
        return "success";
    }
}

💡 最佳实践

  • Logger 声明为 private static final
  • 使用 {} 占位符,不要用 + 拼接字符串
  • 生产环境通常关闭 DEBUG 日志,避免性能损耗。

3. Spring Boot 中的日志配置

Spring Boot 默认集成 SLF4J + Logback,无需额外引入依赖。

3.1 配置方式:application.yml

logging:
  # 指定自定义 logback 配置文件(可选)
  config: classpath:logback.xml
  # 设置特定包的日志级别(常用于开启 SQL 日志)
  level:
    com.itcodai.course03.dao: trace
    com.itcodai.course03.service: debug

🔍 说明:

  • logging.config:指向自定义的 logback.xml
  • logging.level:可快速覆盖某些包的日志级别,优先级高于 logback.xml

3.2 日志级别(从高到低)

级别 用途
ERROR 系统错误、异常
WARN 警告,不影响主流程
INFO 重要业务日志(如启动完成、用户登录)
DEBUG 调试信息(开发阶段使用)
TRACE 更细粒度(如 MyBatis 的 SQL 日志)

生产建议:全局设为 INFO,关键模块可临时调为 DEBUG


4. logback.xml 详解(核心配置文件)

当需要精细控制日志行为时,需编写 logback.xml(放在 src/main/resources 下)。

完整示例:logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 1. 定义日志格式和文件路径 -->
    <property name="LOG_PATTERN" 
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
    <property name="LOG_PATH" value="D:/logs/course03"/> <!-- Windows 路径 -->
    <!-- Linux 示例:<property name="LOG_PATH" value="/var/logs/myapp"/> -->
    <!-- 2. 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- 3. 文件输出(按天+大小滚动) -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件命名规则 -->
            <fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 单个文件最大 100MB -->
            <maxFileSize>100MB</maxFileSize>
            <!-- 保留 30 天日志 -->
            <maxHistory>30</maxHistory>
            <!-- 总日志大小不超过 10GB -->
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- 4. 日志级别与输出目标 -->
    <logger name="com.itcodai.course03" level="INFO" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
    <!-- 5. 根日志器(兜底) -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

关键配置说明

配置项 作用
<property> 定义可复用的变量(如格式、路径)
<appender> 定义日志输出目的地(控制台、文件等)
RollingFileAppender 支持日志滚动(按时间/大小切分)
SizeAndTimeBasedRollingPolicy 同时按天和文件大小滚动
<logger> 为特定包设置独立日志级别和输出方式
additivity="false" 禁止日志向上级(root)重复输出

⚠️ 注意

  • 路径必须是绝对路径(Windows 用 /\\);
  • %i 是文件索引,当日志达到 maxFileSize 时自动生成 app.2025-12-29.0.log, app.2025-12-29.1.log...

5. 测试日志输出

启动项目,访问:

http://localhost:8080/test/log

控制台输出(INFO 级别)

2025-12-29 20:30:15.123 [http-nio-8080-exec-1] INFO  c.i.c.TestController - ======测试日志info级别打印=====
2025-12-29 20:30:15.124 [http-nio-8080-exec-1] ERROR c.i.c.TestController - =====测试日志error级别打印====
2025-12-29 20:30:15.125 [http-nio-8080-exec-1] WARN  c.i.c.TestController - ======测试日志warn级别打印=====
2025-12-29 20:30:15.126 [http-nio-8080-exec-1] INFO  c.i.c.TestController - ======倪升武的个人博客:blog.itcodai.com;倪升武的CSDN博客:blog.csdn.net/eson_15

🔍 注意:DEBUG 日志未输出,因为当前级别为 INFO

同时,可在 D:/logs/course03/ 目录下看到生成的日志文件。


6. 总结与最佳实践

项目 建议
日志框架 ✅ 使用 SLF4J + Logback(Spring Boot 默认)
代码写法 LoggerFactory.getLogger(类名.class) + {} 占位符
日志级别 开发:DEBUG;生产:INFOWARN
日志文件 ✅ 按天+大小滚动,保留 7~30 天
敏感信息 ❌ 禁止记录密码、身份证、手机号等
异常日志 ✅ 使用 logger.error("消息", exception) 记录堆栈

🎯 记住日志是系统的眼睛。良好的日志设计,能让故障排查效率提升 10 倍!

相关文章
|
3月前
|
存储 Java API
Spring Boot使用slf4j进行日志记录
本文介绍了在Spring Boot项目中使用SLF4J结合Logback进行日志管理的方法。通过配置`application.yml`和`logback.xml`,实现日志级别、输出格式、文件存储与滚动策略的灵活控制,并推荐使用SLF4J门面模式替代直接调用具体日志实现,提升系统可维护性与扩展性。
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
949 0
|
3月前
|
存储 SQL Java
Spring Boot使用slf4j进行日志记录
本文介绍了在Spring Boot项目中使用SLF4J结合Logback进行日志管理的最佳实践。相比直接使用System.out.println(),SLF4J作为日志门面,解耦日志实现,提升可维护性。通过application.yml配置日志级别与logback.xml定义输出格式、路径、滚动策略等,实现灵活高效的日志记录。推荐遵循阿里巴巴开发规范,统一使用SLF4J API,便于日志系统替换与统一管理。
|
3月前
|
存储 SQL 监控
SpringBoot- 整合Logback,滚动记录+多文件
`logback-spring.xml` 是 Spring Boot 项目中的日志配置文件,用于定义日志输出格式、级别及存储路径。支持控制台与文件双输出,按时间滚动日志,并分类记录如 SQL、错误、请求参数等信息,便于问题排查与系统监控。
|
安全 Java Spring
Spring Boot 过滤器(Filter)详解
本文详解Spring Boot中过滤器的原理与实践,涵盖Filter接口、执行流程、@Component与FilterRegistrationBean两种实现方式、执行顺序控制及典型应用场景如日志记录、权限验证。对比拦截器,突出其在Servlet容器层的通用性与灵活性,助力构建高效稳定的Web应用。
5547 0
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
1133 0
|
8月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
1486 5
|
8月前
|
搜索推荐 算法 Go
Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
540 1
|
数据采集 监控 Java
Spring Boot日志
Spring Boot日志
500 3