本文提供了一份SpringBoot项目下的Logback日志配置文件的实例,可供参考使用。

logback-spring.xml配置文件

resources目录下的logback-spring.xml文件,可实现:

  • 控制台输出
  • 普通文本日志文件:按天+大小滚动
  • 错误日志单独输出(便于监控告警)

文件内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <property name="LOG_HOME" value="/applog/myapp"/>
    <property name="MAX_FILE_SIZE" value="100MB"/>
    <property name="MAX_HISTORY" value="30"/>
    <property name="TOTAL_SIZE_CAP" value="10GB"/>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{RequestId}] [%X{Ip}] [%X{ProcessId}] [%thread] %-5level %logger{36}#%M:%L - %msg%n"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <encoder>
            <!-- 带颜色的日志输出(用于控制台) -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{RequestId}] [%X{Ip}] [%X{ProcessId}] [%thread] %highlight(%-5level) %cyan(%logger{36})#%M:%L - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 普通文本日志文件:按天+大小滚动 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件名格式:app.2025-01-21.0.log -->
            <fileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 错误日志单独输出(便于监控告警) -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/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.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>7</maxHistory> <!-- 错误日志保留更短 -->
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>
</configuration>

application.yml配置

# 指定logback配置文件位置
logging:
  config: classpath:logback-spring.xml

日志打印pattern配置解释

完整配置:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{RequestId}] [%X{Ip}] [%X{ProcessId}] [%thread] %-5level %logger{36}#%M:%L - %msg%n

逐项解析

占位符含义说明
%d{yyyy-MM-dd HH:mm:ss.SSS}日志时间戳%d:输出日志事件的时间{...}:指定日期格式yyyy-MM-dd HH:mm:ss.SSS:年-月-日 时:分:秒.毫秒(如 2025-04-05 14:30:22.123
[%X{RequestId}]MDC 中的 RequestId%X{key}:从 MDC(Mapped Diagnostic Context) 中获取名为 key 的值若未设置,则输出空字符串 []
[%X{Ip}]MDC 中的客户端 IP同上,通常在拦截器/过滤器中存入用户 IP
[%X{ProcessId}]MDC 中的进程 ID 或业务标识可能是订单号、任务 ID 等,用于关联上下文
[%thread]当前线程名[main][http-nio-8080-exec-2],便于排查多线程问题
%-5level日志级别(左对齐,宽度5)%level:输出日志级别(如 INFO, WARN, ERROR-5:左对齐,占用 5 个字符宽度(INFO DEBUG
%logger{36}日志记录器名称(最多36字符)%logger:输出 Logger 的全限定类名(如 com.example.service.UserService{36}:如果超过 36 字符,会缩写包名(如 c.e.s.UserService
#%M方法名%M:输出调用日志的方法名(如 processOrder)注意:获取方法名有性能开销,生产环境慎用
:%L代码行号输出日志语句所在的源码行号(如 :45)️ 同样有性能损耗,且在 JIT 优化后可能不准
%msg日志消息内容logger.info("Hello {}", name) 中的 "Hello Alice"
%n换行符跨平台换行(Windows 用 rn,Linux 用 n

示例输出

假设你的代码:

// 在 MDC 中设置上下文
MDC.put("RequestId", "req-12345");
MDC.put("Ip", "192.168.1.100");
MDC.put("ProcessId", "order-789");

// 打印日志
logger.info("订单处理成功");

日志输出可能为:

2025-04-05 14:30:22.123 [req-12345] [192.168.1.100] [order-789] [http-nio-8080-exec-2] INFO  c.e.s.OrderService#processOrder:88 - 订单处理成功

️ 注意事项

建议
%M%L生产环境不建议使用,因为:• 需要解析堆栈,性能差• JIT 编译后行号可能不准确• 日志文件体积增大
MDC(%X{}需手动在请求入口(如 Filter)中 MDC.put(),并在出口 MDC.clear(),否则可能内存泄漏或污染其他请求

替代建议(高性能日志格式)

如果你追求性能,可移除方法名和行号:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{RequestId}] [%thread] %-5level %logger{36} - %msg%n

总结

占位符用途是否推荐生产使用
%d时间 必须
%X{}上下文追踪 推荐(需正确管理 MDC)
%thread线程 推荐
%-5level日志级别 推荐
%logger{N}类名 推荐
%M方法名 不推荐
%L行号 不推荐
%msg消息 必须
%n换行 必须
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com