Log4j2 配置文件详解
配置概览
这是一个完整的 Log4j2 配置文件,实现了分级日志存储 + 远程日志收集 + 监控系统集成的日志架构。
ini
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex" />
</Console>
<XMDFile name="xxx_platform" fileName="xxx_platform.log" sizeBasedTriggeringSize="512M"
rolloverMax="15" xmdFilePath="/opt/logs/xxx_platform" addAppkeyToFilePath="false">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex" />
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</XMDFile>
<XMDFile name="xxx_platform-warn" fileName="xxx_platform-warn.log" sizeBasedTriggeringSize="512M"
rolloverMax="15" xmdFilePath="/opt/logs/xxx_platform" addAppkeyToFilePath="false">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex" />
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</XMDFile>
<XMDFile name="xxx_platform-error" fileName="xxx_platform-error.log" sizeBasedTriggeringSize="512M"
rolloverMax="15" xmdFilePath="/opt/logs/xxx_platform" addAppkeyToFilePath="false">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex" />
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
</XMDFile>
<XMDFile name="xxx_platform-debug" fileName="xxx_platform-debug.log" sizeBasedTriggeringSize="512M"
rolloverMax="2" xmdFilePath="/opt/logs/xxx_platform" addAppkeyToFilePath="false">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex" />
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
</XMDFile>
<Scribe name="ScribeAppender">
<LcLayout />
</Scribe>
<Async name="ScribeAsyncAppender" blocking="false">
<AppenderRef ref="ScribeAppender" />
</Async>
<CatAppender name="CatAppender"/>
</appenders>
<loggers>
<logger name="scribe" level="info" additivity="false">
<appender-ref ref="ScribeAsyncAppender" />
</logger>
<root level="info">
<appender-ref ref="xxx_platform" />
<appender-ref ref="xxx_platform-warn" />
<appender-ref ref="xxx_platform-error" />
<appender-ref ref="xxx_platform-debug" />
<AppenderRef ref="CatAppender" />
<AppenderRef ref="ScribeAsyncAppender" />
</root>
</loggers>
</configuration>
Appender 详解
1. Console Appender - 控制台输出
xml
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex" />
</Console>
- 作用: 将日志输出到标准输出(控制台)
- 格式: 包含时间戳、线程、日志级别、类名、文件位置等完整信息
2. XMDFile Appender - 本地文件存储
分级文件存储策略
- info.log: 只记录 INFO 级别日志
- warn.log: 只记录 WARN 级别日志
- error.log: 只记录 ERROR 级别日志
- debug.log: 只记录 DEBUG 级别日志
文件管理配置
- 文件大小 : 单文件最大 512MB (sizeBasedTriggeringSize="512M")
- 历史文件: 最多保留 15 个历史文件(debug 日志保留 2 个)
- 存储路径 :
/opt/logs/应用名称/
目录
3. Scribe Appender - 远程日志收集
xml
<Scribe name="ScribeAppender">
<LcLayout />
</Scribe>
<Async name="ScribeAsyncAppender" blocking="false">
<AppenderRef ref="ScribeAppender" />
</Async>
- 作用: 发送日志到远程日志收集系统
- 异步模式 : blocking="false" 非阻塞,优先保证应用性能
- 可靠性: 网络问题时不影响主应用运行
4. CAT Appender - 监控系统
xml
<CatAppender name="CatAppender"/>
- 作用: 发送日志到分布式监控系统
- 用途: 应用性能监控、业务监控、告警
Logger 配置
1. 特定 Logger
xml
<logger name="scribe" level="info" additivity="false">
<appender-ref ref="ScribeAsyncAppender" />
</logger>
- 作用: 处理日志收集系统自身的日志
- 特点 : additivity="false" 不继承父 logger,避免重复发送
2. Root Logger
xml
<root level="info">
<appender-ref ref="st_plan_platform" />
<appender-ref ref="st_plan_platform-warn" />
<appender-ref ref="st_plan_platform-error" />
<appender-ref ref="st_plan_platform-debug" />
<AppenderRef ref="CatAppender" />
<AppenderRef ref="ScribeAsyncAppender" />
</root>
- 作用: 处理所有其他业务日志
- 输出: 同时输出到本地文件、监控系统、远程收集系统
日志格式说明
PatternLayout 格式
perl
%d{yyyy/MM/dd HH:mm:ss.SSS} %t %-5p %c{1} (%F:%L) - %.-524288msg%n%ex
元素 | 说明 | 示例 |
---|---|---|
%d{yyyy/MM/dd HH:mm:ss.SSS} | 时间戳 | 2024/01/15 14:30:25.123 |
%t | 线程名 | http-nio-8080-exec-1 |
%-5p | 日志级别(左对齐5字符) | INFO |
%c{1} | 类名(简短) | UserService |
(%F:%L) | 文件名:行号 | (UserService.java:42) |
%.-524288msg | 消息内容截断(最大0.5M) | 实际日志消息 |
%n | 换行符 | 跨平台换行 |
%ex | 异常堆栈 | 完整异常信息 |
输出示例
less
2024/01/15 14:30:25.123 main INFO UserService (UserService.java:42) - 用户登录成功: userId=12345
2024/01/15 14:30:25.124 main ERROR OrderService (OrderService.java:89) - 订单处理失败
java.sql.SQLException: Connection timeout
at com.example.OrderService.processOrder(OrderService.java:89)
...
核心概念
Logger vs Appender
- Logger: 决定"记不记" - 控制日志级别和过滤规则
- Appender: 决定"记到哪" - 控制日志输出目标
本地 vs 远程
- 本地存储 (XMDFile) :
- 可靠性高,网络故障时仍可记录
- 便于紧急问题排查
- 直接在服务器上查看
- 远程收集 (Scribe) :
- 集中管理多台服务器日志
- 支持大规模日志分析
- 统一查询和监控
日志流向
普通业务日志
应用代码 → Root Logger → 6个Appender → 本地文件 + 监控系统 + 远程收集
日志系统内部日志
日志系统 → Scribe Logger → ScribeAsyncAppender → 远程收集(仅)
最佳实践
- 分级存储: 不同级别日志分文件存储,便于问题定位
- 异步处理: 远程日志使用异步模式,避免影响应用性能
- 长度限制: 消息最大0.5M,防止超大日志影响系统
- 双重保障: 本地 + 远程存储,确保日志可靠性
- 监控集成: 集成监控系统,支持实时告警和分析
常见问题
- 服务未简化异常日志 : 日志配置文件中存在Appender的PatternLayout标签中增加%ex配置或修改为默认带有%ex的输出格式。
- 服务未配置日志丢弃: AsyncScribe配置blocking=false
- 未指定单条日志最大输出长度: PatternLayout中使用%.-Xmsg语法,其中X是日志输出的最大长度限制(单位:字符数),比如设置成%.-524288msg表示日志输出的长度最大限制为524288个字符,即0.5M,超出的部分直接截断不做输出。
- 服务未异步打印日志: logger和appender修改同步模式为异步模式
- 日志配置中禁用Async/Scribe标签: 只要使用了Async/Scribe标签,就有发生线程阻塞的风险
- Log4j 生产环境禁止将日志输出到标准输出: 生产环境禁止将日志输出到标准输出,会导致线程阻塞,请在生产环境的配置中移除 Console