星云点击:星空遥控器
120.47M · 2026-02-04
本文提供了一份SpringBoot项目下的Logback日志配置文件的实例,可供参考使用。
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>
# 指定logback配置文件位置
logging:
config: classpath:logback-spring.xml
%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 | 换行 | 必须 |