一、环境准备:排除默认日志框架
xml
<!-- pom.xml 关键配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除默认Logback -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入Log4j2核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>3.1.5</version> <!-- 使用最新版本避免漏洞 -->
</dependency>
二、核心配置:log4j2-spring.xml详解
xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<!-- 自定义变量 -->
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
<Property name="LOG_PATH">logs</Property>
<Property name="MAX_FILE_SIZE">100MB</Property>
<Property name="MAX_HISTORY">30</Property>
</Properties>
<Appenders>
<!-- 控制台输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<!-- 滚动文件输出 -->
<RollingFile name="File" fileName="${LOG_PATH}/app.log"
filePattern="${LOG_PATH}/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${MAX_HISTORY}"/>
</RollingFile>
<!-- 异步HTTP报警(需要额外依赖) -->
<Http name="HttpAlarm" url="http://alert-system/logs">
<PatternLayout pattern="{"level":"%level","msg":"%message"}"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT"/>
</Http>
</Appenders>
<Loggers>
<!-- 第三方库日志降级 -->
<Logger name="org.hibernate" level="WARN"/>
<Logger name="org.apache" level="ERROR"/>
<!-- 异步日志提升性能 -->
<AsyncLogger name="com.your.package" level="DEBUG" includeLocation="true">
<AppenderRef ref="File"/>
</AsyncLogger>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
<AppenderRef ref="HttpAlarm" level="ERROR"/>
</Root>
</Loggers>
</Configuration>
三、高级功能:解锁Log4j2的杀手锏
1. 敏感信息脱敏
xml
<PatternLayout pattern="${LOG_PATTERN}">
<Replace regex="(\"password\":\")(.*?)(\")" replacement="$1****$3"/>
</PatternLayout>
2. 多环境配置
xml
<!-- 通过Spring Profile激活不同配置 -->
<SpringProfile name="dev">
<Root level="DEBUG">
<AppenderRef ref="Console"/>
</Root>
</SpringProfile>
<SpringProfile name="prod">
<Root level="WARN">
<AppenderRef ref="File"/>
<AppenderRef ref="HttpAlarm"/>
</Root>
</SpringProfile>
3. 自定义Appender(邮件报警)
java
@Plugin(name = "EmailAppender", category = "Core")
public class EmailAppender extends AbstractAppender {
@PluginFactory
public static EmailAppender createAppender(
@PluginAttribute("name") String name) {
return new EmailAppender(name);
}
@Override
public void append(LogEvent event) {
if (event.getLevel().isMoreSpecificThan(Level.ERROR)) {
sendEmail(event.getMessage().getFormattedMessage());
}
}
}
// 在配置文件中使用
<EmailAppender name="Email"/>
四、性能调优:让日志飞起来
1. 异步日志配置
xml
<!-- 全局异步 -->
<Configuration status="WARN" shutdownTimeout="30">
<AsyncRoot level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</AsyncRoot>
</Configuration>
<!-- 混合模式 -->
<AsyncLoggers>
<AsyncLogger name="com.your.package" level="DEBUG" includeLocation="true">
<AppenderRef ref="File"/>
</AsyncLogger>
</AsyncLoggers>
2. 内存优化
xml
<!-- 使用Garbage-Free日志 -->
<Configuration garbagefree="true">
<PatternLayout>
<Pattern>%d{ISO8601} %msg%n</Pattern>
</PatternLayout>
</Configuration>
五、安全加固:避免Log4j漏洞
1. 版本选择原则
xml
<!-- 必须使用2.17.0+版本 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version> <!-- 最新稳定版 -->
</dependency>
2. 禁用危险特性
bash
# JVM启动参数
-Dlog4j2.formatMsgNoLookups=true
3. 安全扫描
bash
# 使用漏洞扫描工具检查
mvn dependency:tree | grep log4j
六、监控集成:日志可视化
1. ELK集成配置
xml
<!-- Logstash TCP输出 -->
<Socket name="Logstash" host="logstash-host" port="5044" protocol="TCP">
<PatternLayout pattern="%m%n"/>
</Socket>
2. Prometheus监控
xml
<!-- 添加JMX监控 -->
<JMX name="JMX"/>
yaml
# Prometheus配置
scrape_configs:
- job_name: 'log4j'
jmx:
- url: service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
七、常见问题排雷
问题现象 | 解决方案 |
---|---|
日志文件不滚动 | 检查Policies配置,确保文件大小/时间条件触发 |
异步日志丢失 | 增加shutdownTimeout,确保JVM关闭前完成日志写入 |
日志输出乱码 | 检查编码配置:<PatternLayout charset="UTF-8"> |
性能消耗过高 | 启用异步日志,禁用location信息采集 |
配置修改不生效 | 确认文件名为log4j2-spring.xml并位于resources目录 |
最佳实践总结:
- 环境隔离:开发/测试/生产环境使用不同日志级别
- 日志分级:DEBUG级日志用lambda延迟计算
- 定期审计:检查日志配置和滚动策略有效性
- 监控告警:关键ERROR日志触发即时通知