日志
日志是排查线上问题的第一线索。Spring Boot 默认整合 Logback(由 spring-boot-starter-logging 提供,大多数 starter 都会传递引入),且代码统一使用 SLF4J API,日志框架可替换而业务代码不用改。
在代码中打日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
private static final Logger log = LoggerFactory.getLogger(UserService.class);
public void create(String name) {
log.debug("开始创建用户");
log.info("创建用户成功, name={}", name);
log.warn("该用户名已存在: {}", name);
log.error("创建用户失败, name={}", name, new RuntimeException("demo"));
}
}
用 {} 占位符传参,避免字符串拼接的开销;异常对象作为最后一个参数会输出完整堆栈。
级别与常用属性
级别从低到高:trace < debug < info < warn < error,默认 root 为 info。最省事的做法是直接写在 application.properties:
logging.level.root=info
logging.level.com.example.demo=debug # 按包单独调级别
logging.file.name=logs/app.log # 输出到文件
logging.logback.rollingpolicy.max-history=30
logging.logback.rollingpolicy.file-name-pattern=app.%d{yyyy-MM-dd}.%i.log
logging.logback.rollingpolicy.* 控制 Boot 自动装配的滚动策略(文件名模式、单文件大小、保留历史等),各项默认值以官方文档为准。
按天滚动:logback-spring.xml
需要精细控制(按天滚动、保留天数、多环境差异)时,在 src/main/resources 放 logback-spring.xml。推荐用 logback-spring.xml 而非 logback.xml 命名,以支持 <springProfile> 等 Spring 扩展能力。按天滚动的最小配置:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
要点:RollingFileAppender + TimeBasedRollingPolicy 会按 %d{yyyy-MM-dd} 的粒度在每天零点把日志滚到新文件,maxHistory 控制保留天数;如需「按天 + 单文件大小上限」可改用 SizeAndTimeBasedRollingPolicy,写法以官方文档为准。
环境差异
不同环境要不同日志级别,可以用 <springProfile name="dev"> 包裹对应 <logger> 或 <root> 段,配合 05 章的 profile 生效。
小结
记住三件事:代码用 SLF4J + 占位符;临时调级别改 logging.level.*;线上按天滚动用 logback-spring.xml 的 TimeBasedRollingPolicy。这套组合覆盖了大多数项目的日志需求。