Log4j2.xml 配置总结
1、基本信息
Apache Log4j 2 是一个高性能、功能强大的日志记录框架,广泛应用于 Java 应用程序,适用于企业级系统和高并发场景log4j2.xml
是其主要配置文件,采用 XML 格式,用于定义日志的输出目标、级别、格式和存储方式相较于 Log4j 1.x,Log4j 2 提供以下优势:
- 高性能:异步日志记录显著降低延迟,适合高吞吐量应用
- 灵活配置:支持 XML、JSON、YAML 格式配置文件,动态加载功能减少重启需求
- 插件化架构:支持自定义 Logger、Appender 和 Layout
- 安全性增强:修复了 Log4j 1.x 的安全漏洞(如 2021 年的 Log4Shell)
- 异步支持 :通过
AsyncLogger
和AsyncAppender
提升性能 - 丰富的 Appender:支持控制台、文件、数据库、云存储等多种输出
- 过滤器机制 :如
<ThresholdFilter>
,提供细粒度日志控制 - 滚动策略:灵活的文件滚动和归档管理
- 国际化支持:支持多语言日志格式
- 社区活跃:持续更新,适配现代 Java 生态
核心组件
- Logger:捕获日志事件,定义日志级别和记录行为
- Appender:指定日志输出目标(如控制台、文件、数据库)
- Layout:控制日志输出格式(如 PatternLayout、JSONLayout)
- Filter :过滤日志事件(如
<ThresholdFilter>
) - Configuration:配置文件顶层元素,包含所有 Logger、Appender 和 Filter 定义
配置文件加载
Log4j 2 默认加载 classpath:log4j2.xml
,支持通过系统属性 log4j.configurationFile
指定自定义路径(如 file:/path/to/log4j2.xml
)配置文件支持动态加载,通过 monitorInterval
属性实现热更新
application.yaml
yaml
logging:
config: classpath:log4j2.xml
2、配置示例
以下是一个典型的 log4j2.xml
配置,展示 <ThresholdFilter>
、<Policies>
和 <DefaultRolloverStrategy>
的使用:
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} %highlight{%-5p}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue, TRACE=cyan} %c{1}:%L - %m%n</Property>
<Property name="LOG_DIR">logs</Property>
</Properties>
<Appenders>
<!-- 控制台输出,仅记录 INFO 及以上级别 -->
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- 文件输出(多种滚动策略) -->
<RollingFile name="RollingFile" fileName="${LOG_DIR}/app.log"
filePattern="${LOG_DIR}/app-%d{yyyy-MM-dd}-%i.log.gz">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
<OnStartupTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="10" compressionLevel="9" fileIndex="nomax">
<Delete basePath="${LOG_DIR}" maxDepth="2">
<IfFileName glob="*/app-*.log.gz">
<IfLastModified age="30d"/>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<!-- 自定义 Logger -->
<Logger name="com.example" level="debug" additivity="false">
<AppenderRef ref="RollingFile"/>
</Logger>
<!-- 根 Logger -->
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
示例解析
- Configuration :
status="WARN"
设置内部日志级别,monitorInterval="30"
每 30 秒检查配置文件变更 - Properties:定义日志格式(含颜色高亮)和输出目录
- Appenders :
Console
:输出INFO
及以上级别日志,使用<ThresholdFilter>
过滤RollingFile
:输出DEBUG
及以上级别日志,结合时间、大小和启动触发策略滚动,归档文件压缩为.gz
,最多保留 10 个,30 天前的文件自动删除
- Loggers :
- 自定义 Logger
com.example
:记录debug
级别,仅输出到RollingFile
- 根 Logger:记录
info
级别及以上,输出到Console
和RollingFile
- 自定义 Logger
3、属性详解
1. <Configuration>
属性
status
:Log4j 内部日志级别(trace
,debug
,info
,warn
,error
,fatal
)monitorInterval
:配置文件自动重新加载间隔(秒)packages
:自定义插件包路径strict
:启用严格 XML 验证(true/false)
2. <Appenders>
常用类型及属性
- Console :
name
:Appender 名称target
:输出目标(SYSTEM_OUT
或SYSTEM_ERR
)
- File :
fileName
:输出文件路径append
:是否追加(true/false)
- RollingFile :
fileName
:当前日志文件filePattern
:归档文件命名模式(如%d{yyyy-MM-dd}
)Policies
:触发滚动策略DefaultRolloverStrategy
:归档文件管理
- Async :异步 Appender,需配合
<AsyncLogger>
3. <Layout>
常用类型及属性
-
PatternLayout:
pattern
:日志格式,常用占位符:%d
:日期时间%p
:日志级别%c
:Logger 名称%L
:行号%m
:日志消息%n
:换行符%highlight
:为日志级别设置颜色
-
JSONLayout:输出 JSON 格式日志
ini<JSONLayout compact="true" eventEol="true"> <KeyValuePair key="time" value="%d{yyyy-MM-dd HH:mm:ss.SSS}"/> <KeyValuePair key="thread" value="%t"/> <KeyValuePair key="level" value="%p"/> <KeyValuePair key="logger" value="%c{1}"/> <KeyValuePair key="message" value="%m"/> </JSONLayout>
-
XMLLayout:输出 XML 格式日志
- 需引入相关xml依赖
xml<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.15.2</version> </dependency> </dependencies>
4. <Loggers>
属性
- Logger :
name
:包或类名level
:日志级别(trace
,debug
,info
,warn
,error
,fatal
)additivity
:是否传递给父 Logger(true/false)
- Root:默认 Logger,处理未匹配的日志
5. <Policies>
详细介绍
<Policies>
定义 RollingFile
Appender 的滚动触发策略,决定何时归archive日志文件以下是所有策略:
(1) TimeBasedTriggeringPolicy
基于时间的滚动策略
- 属性 :
interval
:滚动间隔,单位由filePattern
的最小时间单位决定(默认 1)modulate
:是否对齐时间边界(true/false,默认 false)
- 示例 :
interval="1" modulate="true"
配合%d{yyyy-MM-dd}
,每天 00:00 滚动
(2) SizeBasedTriggeringPolicy
基于文件大小的滚动策略
- 属性 :
size
:文件大小阈值(支持 KB、MB、GB)
- 示例 :
size="10 MB"
,文件达 10 MB 触发滚动
(3) OnStartupTriggeringPolicy
应用程序启动时触发滚动
- 属性:无
- 示例 :
<OnStartupTriggeringPolicy/>
,启动时归档
(4) CronTriggeringPolicy
基于 Cron 表达式的滚动策略
- 属性 :
schedule
:Cron 表达式(如0 0 0 * * ?
表示每天 00:00)evaluateOnStartup
:启动时是否评估(true/false,默认 false)
- 示例 :
schedule="0 0 0 * * ?"
,每天 00:00 滚动
(5) CompositeTriggeringPolicy
组合多个策略,只有所有子策略满足时触发
-
示例 :
xml<CompositeTriggeringPolicy> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="100 MB"/> </CompositeTriggeringPolicy>
(6) Custom Triggering Policies
通过实现 TriggeringPolicy
接口自定义策略
<Policies>
注意事项
- 默认策略为 或 关系,任意策略满足即触发
TimeBasedTriggeringPolicy
和CronTriggeringPolicy
依赖filePattern
时间模式- 避免过小
size
或interval
,防止频繁滚动
6. <DefaultRolloverStrategy>
详细介绍
<DefaultRolloverStrategy>
定义 RollingFile
Appender 的归档文件管理策略,控制归档后的文件命名、压缩和删除
(1) 基本属性
max
:最大归档文件数(默认 7)超出时删除最旧文件- 示例:
max="10"
,保留最多 10 个归档文件
- 示例:
fileIndex
:归档文件索引方式:nomax
:按时间顺序递增(最新文件索引最大)min
:索引从 1 开始递增,最新文件索引最小- 示例:
fileIndex="nomax"
,生成app-2025-07-09-1.log.gz
,app-2025-07-09-2.log.gz
等
compressionLevel
:压缩级别(0-9,0 表示无压缩,9 表示最大压缩,仅对.gz
或.zip
)- 示例:
compressionLevel="9"
,最大压缩
- 示例:
- 注意事项 :
- 合理设置
max
防止磁盘溢出 - 高
compressionLevel
增加 CPU 开销 fileIndex="min"
可能导致旧文件覆盖,需谨慎
- 合理设置
(2) 条件
自动删除旧归档文件
-
子节点 :
<IfFileName>
:匹配文件名glob
:通配符模式(如*/app-*.log.gz
)regex
:正则表达式
<IfLastModified>
:根据最后修改时间删除age
:时间阈值(如30d
)
<IfAccumulatedFileSize>
:根据总文件大小删除exceeds
:大小阈值(如100 MB
)
<IfAccumulatedFileCount>
:根据文件数量删除exceeds
:数量阈值
<IfAny>
/<IfAll>
:组合条件(或/与逻辑)
-
示例 :
xml<Delete basePath="${LOG_DIR}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz"> <IfLastModified age="30d"/> </IfFileName> </Delete>
- 删除 30 天前的
.log.gz
文件,搜索深度 2 级目录
- 删除 30 天前的
(3) <DirectWriteRolloverStrategy>
直接写入归档文件,适合高吞吐量场景
(4) Custom Rollover Strategies
通过实现 RolloverStrategy
接口自定义
<DefaultRolloverStrategy>
注意事项
- 测试
<Delete>
条件,避免误删 - 确保
filePattern
与策略匹配 - 平衡压缩与性能
7. <ThresholdFilter>
详细介绍
<ThresholdFilter>
是一种日志过滤器,用于根据日志级别过滤事件,控制哪些日志被 Appender 处理常用于为不同输出目标设置不同的日志级别阈值(如控制台仅记录 INFO
,文件记录 DEBUG
)
(1) 属性
-
level
:日志级别阈值(trace
,debug
,info
,warn
,error
,fatal
)- 仅允许达到或高于该级别的日志通过
-
onMatch
:当日志级别满足条件时的行为:ACCEPT
:允许日志通过DENY
:拒绝日志NEUTRAL
:继续处理其他过滤器(默认)
-
onMismatch
:当日志级别不满足条件时的行为:ACCEPT
,DENY
,NEUTRAL
(默认NEUTRAL
)
-
示例 :
xml<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
- 仅允许
INFO
及以上级别日志通过,低于INFO
的日志被拒绝
- 仅允许
(2) 使用场景
-
分离日志级别 :为控制台设置高阈值(如
INFO
),为文件设置低阈值(如DEBUG
),减少控制台输出 -
性能优化:过滤低级别日志,降低 I/O 开销
-
多目标输出:不同 Appender 使用不同过滤器,实现差异化日志记录
-
示例 :
xml<Console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_PATTERN}"/> </Console> <RollingFile name="RollingFile" fileName="${LOG_DIR}/app.log"> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_PATTERN}"/> </RollingFile>
- 控制台仅记录
INFO
及以上,文件记录DEBUG
及以上
- 控制台仅记录
(3) 放置位置
-
Appender 级别:应用于特定 Appender,影响该 Appender 的所有日志
-
AppenderRef 级别:应用于特定 Logger 的 Appender 引用,影响该 Logger 的日志
-
Logger 级别:应用于 Logger,影响其所有 Appender
-
示例 (AppenderRef 级别):
xml<Logger name="com.example" level="debug" additivity="false"> <AppenderRef ref="RollingFile"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </AppenderRef> </Logger>
- 仅
ERROR
及以上级别日志输出到RollingFile
- 仅
(4) 与其他过滤器组合
-
可与
TimeFilter
,RegexFilter
,ScriptFilter
等组合,实现复杂过滤逻辑 -
示例 (组合过滤):
xml<Console name="Console" target="SYSTEM_OUT"> <Filters> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="NEUTRAL"/> <RegexFilter regex=".*ERROR.*" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout pattern="${LOG_PATTERN}"/> </Console>
- 仅允许
INFO
及以上级别且包含 "ERROR" 的日志输出
- 仅允许
<ThresholdFilter>
注意事项
- 级别优先级:过滤器级别高于 Logger 级别,若过滤器拒绝日志,Logger 级别无效
- 性能影响:过多过滤器可能增加处理开销,需精简
- 调试 :启用
status="debug"
检查过滤器行为 - 默认行为 :未设置
onMatch
或onMismatch
时,默认NEUTRAL
,可能导致意外日志输出 - 多过滤器逻辑 :多个过滤器按顺序处理,
DENY
或ACCEPT
会终止后续过滤
4、注意事项
- 性能优化 :
- 使用异步 Logger 或 Appender 降低延迟
- 优化
<Policies>
和<DefaultRolloverStrategy>
,避免频繁滚动 - 使用
<ThresholdFilter>
减少低级别日志输出
- 安全性 :
- 确保日志文件路径安全,防止路径遍历
- 定期清理归档日志,防止磁盘溢出
- 配置动态性 :
- 设置
monitorInterval
动态加载配置 - 使用
${}
引用环境变量
- 设置
- 日志级别管理 :
- 合理设置 Logger 级别和
<ThresholdFilter>
,避免过多日志 - 使用
additivity="false"
防止重复输出
- 合理设置 Logger 级别和
- 兼容性 :
- Log4j 2 不兼容 Log4j 1.x,迁移需重写配置
- 确保依赖版本一致(如
log4j-core
2.20.0)
- 控制台颜色 :
- 使用
%highlight
和 Jansi 库 - 避免在 CI/CD 环境中启用颜色,防止乱码
- 使用
- Policies 和 Rollover :
- 确保
filePattern
与TimeBasedTriggeringPolicy
匹配 - 测试
<Delete>
条件,避免误删 - 平衡压缩级别与性能
- 确保
- ThresholdFilter 特定注意事项 :
- 优先级高于 Logger 级别,需合理配置
- 避免过多过滤器导致性能下降
- 测试过滤逻辑,确保符合预期
- 调试与监控 :
- 使用
status="debug"
排查配置问题 - 验证日志输出、滚动、删除和过滤行为
- 使用
- 多环境支持 :
- 使用
<If>
标签或环境变量适配开发、测试、生产环境
- 使用
5、总结
log4j2.xml
是 Log4j 2 的核心配置文件,支持灵活的日志记录配置<ThresholdFilter>
提供基于日志级别的过滤,适合差异化输出需求<Policies>
控制滚动触发,<DefaultRolloverStrategy>
管理归档文件,配合合理配置可实现高效日志管理针对 IntelliJ IDEA 控制台颜色问题,启用 %highlight
和 Jansi 即可解决通过优化性能、安全性和兼容性,确保日志系统在企业级应用中稳定运行