Spring Boot 日志体系如何组成?logback 分级输出与生产配置怎么做?
结论先行:Spring Boot 通过 spring-boot-starter-logging 默认集成 SLF4J + Logback,应用中一律用 SLF4J API 编程,实现可无痛切换。日常开发用 logging.level.* 按包调级别,生产用 logback-spring.xml 定制格式、滚动与按环境输出。
一、日志体系组成
| 层 | 代表 | 职责 |
|---|---|---|
| 门面 API | SLF4J | 应用代码只依赖它 |
| 实现 | Logback(默认)/ Log4j2 | 真正写日志 |
| 桥接 | log4j-to-slf4j 等 | 让第三方库日志统一走 SLF4J |
private static final Logger log = LoggerFactory.getLogger(DemoService.class);
log.info("订单创建 id={}", orderId); // 占位符,避免字符串拼接
换 Log4j2:排除 spring-boot-starter-logging,引入 spring-boot-starter-log4j2。
二、快速分级配置
logging:
level:
root: info # 全局级别
com.example.order: debug # 局部更细
org.springframework.web: warn
pattern:
console: "%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n"
file:
name: logs/app.log # 输出到文件(可选)
- 级别从低到高:trace < debug < info < warn < error;调低包级别可查 SQL/参数(配合 mybatis 等);
- 编程式临时调级:Actuator loggers 端点(POST 修改运行中级别的调试神器)。
三、logback-spring.xml 生产要点
- 用 logback-spring.xml 而非 logback.xml,才能用 Spring 扩展标签;
- 滚动策略:SizeAndTimeBasedRollingPolicy 按天/大小切分 + 保留天数,防止单文件无限增长;
- 按环境区分输出:
<springProfile name="prod">里开文件/告警输出,dev 只打控制台; - 建议给 traceId/spanId 预留 MDC 占位(链路追踪时打印 %X{traceId});
- 打印堆栈与业务上下文并用,错误日志要包含关键参数,避免“只看得到异常看不到数据”。
常见追问 / 记忆点
- 追问:应用里能不能直接用 Logback 类?答:不推荐,用 SLF4J API,避免锁定实现。
- 追问:线上要临时看 debug 日志怎么办?答:Actuator loggers 端点动态调级,用后还原,无需重启。
- 记忆点:编码用 SLF4J、调级用 yml、精细用 logback-spring.xml;滚动 + 分级 + MDC 是生产三件套。