一、基础配置:快速启用Logback
1. 依赖管理(SpringBoot默认支持Logback)
xml
<!-- 无需额外依赖,但需要排除其他日志框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
二、核心配置文件:logback-spring.xml
1. 多环境日志配置模板
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 公共属性定义 -->
<property name="LOG_PATH" value="logs" />
<property name="APP_NAME" value="myapp" />
<property name="MAX_HISTORY" value="30" />
<!-- 控制台输出(开发环境专用) -->
<springProfile name="dev">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<!-- 文件滚动输出(生产环境) -->
<springProfile name="prod">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<!-- 邮件报警(ERROR级别触发) -->
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.example.com</smtpHost>
<to>[email protected]</to>
<from>[email protected]</from>
<subject>【${APP_NAME}】系统异常:%logger{20} - %m</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n%ex</pattern>
</layout>
<threshold>ERROR</threshold>
</appender>
<root level="INFO">
<springProfile name="dev">
<appender-ref ref="CONSOLE" />
</springProfile>
<springProfile name="prod">
<appender-ref ref="FILE" />
<appender-ref ref="EMAIL" />
</springProfile>
</root>
</configuration>
三、高级输出方案:解锁Logback全技能
1. 数据库存储日志(MySQL示例)
xml
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="com.zaxxer.hikari.HikariDataSource">
<driverClassName>com.mysql.cj.jdbc.Driver</driverClassName>
<jdbcUrl>jdbc:mysql://localhost:3306/logs</jdbcUrl>
<username>root</username>
<password>yourpassword</password>
</dataSource>
</connectionSource>
</appender>
2. 分布式日志收集(Kafka集成)
xml
<appender name="KAFKA" class="com.github.danielwegener.logback.kafka.KafkaAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
<topic>app-logs</topic>
<keyingStrategy class="com.github.danielwegener.logback.kafka.keying.RoundRobinKeyingStrategy"/>
<deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>
<producerConfig>bootstrap.servers=kafka1:9092,kafka2:9092</producerConfig>
</appender>
3. 云原生日志(AWS S3存档)
xml
<appender name="S3" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/tmp/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/tmp/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
<!-- 配合aws-cli定期上传到S3 -->
</appender>
四、性能优化与安全
1. 异步日志提升吞吐量
xml
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>1024</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="FILE" />
</appender>
2. 敏感信息过滤
xml
<encoder>
<pattern>%msg</pattern>
<replace>
<regex>"password":".*?"</regex>
<replacement>"password":"******"</replacement>
</replace>
</encoder>
3. 动态日志级别调整(通过Actuator)
properties
# application.properties
management.endpoints.web.exposure.include=loggers
management.endpoint.loggers.enabled=true
bash
# 动态修改日志级别
curl -X POST http://localhost:8080/actuator/loggers/com.example \
-H "Content-Type: application/json" \
-d '{"configuredLevel":"DEBUG"}'
五、监控与维护
1. 集成Prometheus监控
xml
<!-- 添加Micrometer指标 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
java
// 自动暴露日志指标
@Bean
public LogbackMetrics logbackMetrics() {
return new LogbackMetrics();
}
2. 日志文件健康检查
java
@Component
public class LogFileHealthIndicator implements HealthIndicator {
@Value("${LOG_PATH}")
private String logPath;
@Override
public Health health() {
File logFile = new File(logPath + "/app.log");
return logFile.exists() ?
Health.up().build() :
Health.down().withDetail("error", "日志文件丢失").build();
}
}
六、常见问题解决方案
问题现象 | 解决方案 |
---|---|
日志文件不滚动 | 检查<rollingPolicy> 配置,确认文件命名模式正确 |
异步日志丢失 | 增加<queueSize> 并添加关闭钩子 |
邮件发送失败 | 检查SMTP配置和网络防火墙设置 |
数据库连接泄漏 | 使用连接池并配置合理的空闲超时时间 |
日志输出乱码 | 统一编码为UTF-8,检查数据库字符集设置 |
最佳实践总结:
- 环境隔离 :通过
<springProfile>
区分开发/生产配置 - 分级存储:DEBUG日志存本地,ERROR日志发报警
- 定期归档:结合云存储实现长期日志保留
- 监控告警:集成Prometheus+Alertmanager实时监控