SpringBoot整合Logback的完整配置指南

 更新时间:2026年07月13日 08:35:18   作者:张老师技术栈  
日志是生产环境中最重要的排错手段,没有日志,线上出了问题就像瞎 子摸象,SpringBoot 默认使用 Logback 作为日志框架,配置灵活、性能优异,因此本文给大家介绍了SpringBoot整合Logback的完整配置指南,需要的朋友可以参考下

引言

日志是生产环境中最重要的排错手段。没有日志,线上出了问题就像瞎 子摸象。SpringBoot 默认使用 Logback 作为日志框架,配置灵活、性能优异。

一、为什么选 Logback

Logback 是 Log4j 的作者开发的升级版框架,相比其他日志框架有显著优势:

对比LogbackLog4jLog4j2
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
配置XML 灵活PropertiesXML/JSON
自动重载✅ 支持
SpringBoot 默认✅ 默认集成
文件归档✅ 支持

结论: SpringBoot 用 Logback 就够了,除非对性能有极端要求才换 Log4j2。

二、SpringBoot 默认日志配置

SpringBoot 在 classpath 下放一个 logback-spring.xml 即可自动生效。

1. 基础配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 日志文件路径 -->
    <property name="LOG_PATH" value="/var/log/seckill"/>
    <property name="LOG_NAME" value="seckill"/>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件输出(滚动归档) -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天归档,保留 30 天 -->
            <fileNamePattern>${LOG_PATH}/${LOG_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 异步输出(提升性能) -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE"/>
        <queueSize>512</queueSize>
        <discardingThreshold>0</discardingThreshold>
    </appender>
    <!-- 包级别控制 -->
    <logger name="com.zhang.seckill" level="DEBUG"/>
    <logger name="org.springframework" level="WARN"/>
    <!-- 根日志级别 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

2. 配置说明

<!-- 核心参数说明 -->
<!-- pattern 格式说明:
     %d            → 日期时间
     %thread       → 线程名
     %-5level      → 日志级别(左对齐5位)
     %logger{36}   → 类名(缩写)
     %msg          → 日志消息
     %n            → 换行
     %line         → 行号(生产慎用,影响性能)
     %M            → 方法名(生产慎用)
-->
<!-- rollingPolicy 归档策略:
     TimeBasedRollingPolicy → 基于时间
     SizeAndTimeBasedRollingPolicy → 基于时间+大小
     maxHistory → 保留天数
-->

三、多环境配置

不同环境使用不同的日志级别和输出方式。

1. 开发环境

<!-- logback-spring.xml 通过 springProfile 区分环境 -->
<springProfile name="dev">
    <root level="DEBUG">
        <appender-ref ref="CONSOLE"/>
    </root>
</springProfile>
<springProfile name="prod">
    <root level="INFO">
        <appender-ref ref="ASYNC"/>
    </root>
</springProfile>

2. application.yml 配置

# 开发环境
spring:
  profiles: dev
logging:
  level:
    com.zhang: DEBUG
# 生产环境
---
spring:
  profiles: prod
logging:
  level:
    com.zhang: INFO
  file:
    path: /var/log/seckill

四、日志最佳实践

1. 正确的日志写法

@Service
public class OrderService {

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

    public void createOrder(OrderDTO dto) {
        // ✅ 正确:使用占位符,不拼接字符串
        log.info("用户 {} 创建订单,金额: {}", dto.getUserId(), dto.getAmount());

        // ❌ 错误:字符串拼接,即使不输出也浪费性能
        log.info("用户 " + dto.getUserId() + " 创建订单");

        try {
            // 业务逻辑
        } catch (Exception e) {
            // ✅ 正确:打印堆栈
            log.error("创建订单失败: orderNo={}", orderNo, e);

            // ❌ 错误:不打印堆栈,无法定位
            log.error("创建订单失败: " + e.getMessage());
        }
    }
}

2. 日志级别选择

// ERROR:影响功能的严重错误
log.error("数据库连接失败", e);

// WARN:不影响功能但需要注意
log.warn("用户 {} 登录失败,密码错误", userId);

// INFO:关键业务流程
log.info("订单 {} 创建成功", orderNo);

// DEBUG:开发调试信息(生产关闭)
log.debug("SQL 执行结果: {}", result);

// TRACE:详细跟踪(极少使用)
log.trace("循环第 {} 次", i);

3. 日志追踪 ID

在分布式系统中,通过 MDC 给每个请求加上唯一 ID,方便串联日志:

@Component
public class TraceIdInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) {
        // 生成或获取 TraceId
        String traceId = request.getHeader("X-Trace-Id");
        if (traceId == null || traceId.isEmpty()) {
            traceId = IdUtil.simpleUUID();
        }
        MDC.put("traceId", traceId);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler, Exception ex) {
        MDC.clear();
    }
}
<!-- logback-spring.xml 中添加 traceId 输出 -->
<encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%n</pattern>
</encoder>

五、常见问题

1. 日志没有输出

# 检查 application.yml 中是否关闭了日志
logging:
  level:
    root: OFF   # ← 关闭了,应该改成 INFO
# 或者检查 logback-spring.xml 中 root 级别
<root level="INFO">

2. 日志文件过大

<!-- 按大小归档,限制每个文件大小 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <maxFileSize>100MB</maxFileSize>
    <maxHistory>30</maxHistory>
    <totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>

3. 日志路径不存在

# 启动前创建日志目录
mkdir -p /var/log/seckill
# 或者在配置中自动创建
<if condition='!property("LOG_PATH").equals("")'>
    <then>
        <appender name="FILE" class="...">
            <file>${LOG_PATH}/${LOG_NAME}.log</file>
        </appender>
    </then>
</if>

六、秒杀系统的日志配置

<!-- 秒杀系统生产环境日志配置 -->
<springProfile name="prod">
    <property name="LOG_PATH" value="/var/log/seckill"/>
    <!-- 错误日志单独归档 -->
    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="ERROR_LOG"/>
        <appender-ref ref="ASYNC"/>
    </root>
</springProfile>

总结

日志是生产环境的第一道防线。配置好日志、写好日志、用好日志,线上问题排查效率提升 10 倍。

开发环境:DEBUG 级别 + 控制台输出
测试环境:INFO 级别 + 文件输出
生产环境:INFO 级别 + 异步文件输出 + 错误日志单独归档

到此这篇关于SpringBoot整合Logback的完整配置指南的文章就介绍到这了,更多相关SpringBoot整合Logback内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 第一次通过docker部署java服务的全过程

    第一次通过docker部署java服务的全过程

    这篇文章主要介绍了第一次通过docker部署java服务的相关资料,在这个过程中,我们将从基础开始,逐步深入到Docker镜像的构建和Java项目的部署,文中通过代码及图文介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • MyBatis-Plus 分页不生效的解决方法

    MyBatis-Plus 分页不生效的解决方法

    本文主要介绍了MyBatis-Plus 分页不生效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 详解基于IDEA2020.1的JAVA代码提示插件开发例子

    详解基于IDEA2020.1的JAVA代码提示插件开发例子

    这篇文章主要介绍了详解基于IDEA2020.1的JAVA代码提示插件开发例子,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java实现基于TCP的通讯程序实例解析

    Java实现基于TCP的通讯程序实例解析

    这篇文章主要介绍了Java实现基于TCP的通讯程序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • JVM的垃圾回收算法一起来看看

    JVM的垃圾回收算法一起来看看

    这篇文章主要为大家详细介绍了JVM的垃圾回收算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • SpringBoot如何统一配置bean的别名

    SpringBoot如何统一配置bean的别名

    这篇文章主要介绍了SpringBoot如何统一配置bean的别名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 如何用Java模拟XN*2图灵机

    如何用Java模拟XN*2图灵机

    这篇文章主要介绍了如何用Java模拟XN*2图灵机方法,感兴趣的朋友可以参考下
    2021-04-04
  • Java遍历集合的三种方式

    Java遍历集合的三种方式

    本文主要对于遍历集合获取其对象,总结的三种简单的方式进行介绍,文章中举了两个案例进行对比,具有很好的参考价值,下面就跟小编一起来看下吧
    2016-12-12
  • 使用SpringMVC的@Validated注解验证的实现

    使用SpringMVC的@Validated注解验证的实现

    这篇文章主要介绍了使用SpringMVC的@Validated注解验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 基于hibernate框架在eclipse下的配置方法(必看篇)

    基于hibernate框架在eclipse下的配置方法(必看篇)

    下面小编就为大家带来一篇基于hibernate框架在eclipse下的配置方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论