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 倍!

相关文章
|
12天前
|
数据采集 人工智能 安全
|
7天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
344 164
|
6天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
345 155
|
7天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
581 4
|
15天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
1019 7

热门文章

最新文章