🎯 本章学习目标
- 理解SpringBoot日志系统架构
- 掌握日志级别和配置方法
- 学会使用不同的日志框架
- 了解日志文件管理和轮转
- 掌握生产环境日志最佳实践
⏰ 预计学习时间
1.5小时(理论学习 + 日志配置实践)
🏗️ SpringBoot日志架构
默认日志配置:
- SLF4J:日志门面(Facade)
- Logback:默认日志实现
- Commons Logging:Spring框架使用
- JUL:Java原生日志
日志流程:
应用代码 → SLF4J API → 日志实现 → 输出目标
↓ ↓ ↓ ↓
Logger 门面接口 Logback 控制台/文件
💡 为什么使用SLF4J?
SLF4J提供了统一的日志接口,可以在运行时绑定不同的日志实现,提高了代码的可移植性
⚙️ 基础日志配置
application.yml配置:
logging:
level:
root: INFO
com.example: DEBUG
org.springframework.web: DEBUG
org.hibernate.SQL: DEBUG
org.hibernate.type: TRACE
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
file:
name: logs/application.log
max-size: 10MB
max-history: 30
pattern:
console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([%thread]){magenta} %clr(%-5level){highlight} %clr(%logger{36}){cyan} - %msg%n"
Java代码中使用:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class UserController {
private static final Logger logger =
LoggerFactory.getLogger(UserController.class);
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
logger.info("获取用户信息,ID: {}", id);
try {
User user = userService.findById(id);
logger.debug("用户信息: {}", user);
return user;
} catch (Exception e) {
logger.error("获取用户失败,ID: {}", id, e);
throw e;
}
}
}
🔧 高级日志配置
自定义Logback配置(logback-spring.xml):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<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>logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>logs/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/error.%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>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
<logger name="com.example" level="DEBUG"/>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
⚠️ 配置文件优先级
logback-spring.xml > logback.xml > application.yml中的logging配置
🚀 生产环境最佳实践
性能优化:
- 使用异步日志减少I/O阻塞
- 合理设置日志级别
- 避免在循环中打印大量日志
- 使用参数化日志避免字符串拼接
异步日志配置:
logging:
level:
root: INFO
com.example: DEBUG
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<appender-ref ref="FILE"/>
</appender>
日志安全:
- 避免记录敏感信息(密码、身份证等)
- 对敏感数据进行脱敏处理
- 控制日志文件访问权限
- 定期清理过期日志
📊 日志监控与分析
日志收集方案:
- ELK Stack:Elasticsearch + Logstash + Kibana
- Fluentd:统一日志收集层
- Prometheus + Grafana:指标监控
- Zipkin/Jaeger:分布式链路追踪
结构化日志:
import net.logstash.logback.marker.Markers;
logger.info(Markers.append("userId", userId)
.and(Markers.append("action", "login"))
.and(Markers.append("ip", clientIp)),
"用户登录成功");
{
"timestamp": "2023-12-01T10:30:00.123Z",
"level": "INFO",
"message": "用户登录成功",
"userId": "12345",
"action": "login",
"ip": "192.168.1.100"
}
💡 监控指标
关注ERROR日志数量、响应时间、异常堆栈等关键指标,设置合理的告警阈值
❓ 常见问题解决
1. 日志不输出到文件
logging:
file:
name: ./logs/app.log
logging:
file:
name: /var/log/myapp/app.log
2. 日志级别不生效
logging:
level:
com.example.service: DEBUG
com.example: INFO
3. 日志文件过大
logging:
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 30
total-size-cap: 1GB
🎯 学习总结
核心知识点:
- SpringBoot默认使用SLF4J + Logback
- 日志级别:TRACE < DEBUG < INFO < WARN < ERROR
- 支持多环境配置和外部化配置
- 可以通过配置文件或代码自定义日志行为
实践建议:
- 开发环境使用DEBUG级别
- 生产环境使用INFO或WARN级别
- 重要业务操作记录INFO日志
- 异常情况记录ERROR日志
🏆 核心要点
合理的日志配置是应用监控和问题排查的基础,要根据不同环境选择合适的日志级别和输出方式