Log4j2.xml配置总结,就这个标题就挺好

Log4j2.xml 配置总结

1、基本信息

Apache Log4j 2 是一个高性能、功能强大的日志记录框架,广泛应用于 Java 应用程序,适用于企业级系统和高并发场景log4j2.xml 是其主要配置文件,采用 XML 格式,用于定义日志的输出目标、级别、格式和存储方式相较于 Log4j 1.x,Log4j 2 提供以下优势:

  1. 高性能:异步日志记录显著降低延迟,适合高吞吐量应用
  2. 灵活配置:支持 XML、JSON、YAML 格式配置文件,动态加载功能减少重启需求
  3. 插件化架构:支持自定义 Logger、Appender 和 Layout
  4. 安全性增强:修复了 Log4j 1.x 的安全漏洞(如 2021 年的 Log4Shell)
  5. 异步支持 :通过 AsyncLoggerAsyncAppender 提升性能
  6. 丰富的 Appender:支持控制台、文件、数据库、云存储等多种输出
  7. 过滤器机制 :如 <ThresholdFilter>,提供细粒度日志控制
  8. 滚动策略:灵活的文件滚动和归档管理
  9. 国际化支持:支持多语言日志格式
  10. 社区活跃:持续更新,适配现代 Java 生态

核心组件

  1. Logger:捕获日志事件,定义日志级别和记录行为
  2. Appender:指定日志输出目标(如控制台、文件、数据库)
  3. Layout:控制日志输出格式(如 PatternLayout、JSONLayout)
  4. Filter :过滤日志事件(如 <ThresholdFilter>
  5. 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>

示例解析

  • Configurationstatus="WARN" 设置内部日志级别,monitorInterval="30" 每 30 秒检查配置文件变更
  • Properties:定义日志格式(含颜色高亮)和输出目录
  • Appenders
    • Console:输出 INFO 及以上级别日志,使用 <ThresholdFilter> 过滤
    • RollingFile:输出 DEBUG 及以上级别日志,结合时间、大小和启动触发策略滚动,归档文件压缩为 .gz,最多保留 10 个,30 天前的文件自动删除
  • Loggers
    • 自定义 Logger com.example:记录 debug 级别,仅输出到 RollingFile
    • 根 Logger:记录 info 级别及以上,输出到 ConsoleRollingFile

3、属性详解

1. <Configuration> 属性

  • status:Log4j 内部日志级别(trace, debug, info, warn, error, fatal
  • monitorInterval:配置文件自动重新加载间隔(秒)
  • packages:自定义插件包路径
  • strict:启用严格 XML 验证(true/false)

2. <Appenders> 常用类型及属性

  • Console
    • name:Appender 名称
    • target:输出目标(SYSTEM_OUTSYSTEM_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> 注意事项
  • 默认策略为 关系,任意策略满足即触发
  • TimeBasedTriggeringPolicyCronTriggeringPolicy 依赖 filePattern 时间模式
  • 避免过小 sizeinterval,防止频繁滚动

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 级目录
(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" 检查过滤器行为
  • 默认行为 :未设置 onMatchonMismatch 时,默认 NEUTRAL,可能导致意外日志输出
  • 多过滤器逻辑 :多个过滤器按顺序处理,DENYACCEPT 会终止后续过滤

4、注意事项

  1. 性能优化
    • 使用异步 Logger 或 Appender 降低延迟
    • 优化 <Policies><DefaultRolloverStrategy>,避免频繁滚动
    • 使用 <ThresholdFilter> 减少低级别日志输出
  2. 安全性
    • 确保日志文件路径安全,防止路径遍历
    • 定期清理归档日志,防止磁盘溢出
  3. 配置动态性
    • 设置 monitorInterval 动态加载配置
    • 使用 ${} 引用环境变量
  4. 日志级别管理
    • 合理设置 Logger 级别和 <ThresholdFilter>,避免过多日志
    • 使用 additivity="false" 防止重复输出
  5. 兼容性
    • Log4j 2 不兼容 Log4j 1.x,迁移需重写配置
    • 确保依赖版本一致(如 log4j-core 2.20.0)
  6. 控制台颜色
    • 使用 %highlight 和 Jansi 库
    • 避免在 CI/CD 环境中启用颜色,防止乱码
  7. Policies 和 Rollover
    • 确保 filePatternTimeBasedTriggeringPolicy 匹配
    • 测试 <Delete> 条件,避免误删
    • 平衡压缩级别与性能
  8. ThresholdFilter 特定注意事项
    • 优先级高于 Logger 级别,需合理配置
    • 避免过多过滤器导致性能下降
    • 测试过滤逻辑,确保符合预期
  9. 调试与监控
    • 使用 status="debug" 排查配置问题
    • 验证日志输出、滚动、删除和过滤行为
  10. 多环境支持
    • 使用 <If> 标签或环境变量适配开发、测试、生产环境

5、总结

log4j2.xml 是 Log4j 2 的核心配置文件,支持灵活的日志记录配置<ThresholdFilter> 提供基于日志级别的过滤,适合差异化输出需求<Policies> 控制滚动触发,<DefaultRolloverStrategy> 管理归档文件,配合合理配置可实现高效日志管理针对 IntelliJ IDEA 控制台颜色问题,启用 %highlight 和 Jansi 即可解决通过优化性能、安全性和兼容性,确保日志系统在企业级应用中稳定运行

相关推荐
南雨北斗12 分钟前
TP6使用PHPMailer发送邮件
后端
你的人类朋友15 分钟前
🤔什么时候用BFF架构?
前端·javascript·后端
争不过朝夕,又念着往昔1 小时前
Go语言反射机制详解
开发语言·后端·golang
绝无仅有3 小时前
企微审批对接错误与解决方案
后端·算法·架构
Super Rookie3 小时前
Spring Boot 企业项目技术选型
java·spring boot·后端
来自宇宙的曹先生3 小时前
用 Spring Boot + Redis 实现哔哩哔哩弹幕系统(上篇博客改进版)
spring boot·redis·后端
expect7g3 小时前
Flink-Checkpoint-1.源码流程
后端·flink
00后程序员4 小时前
Fiddler中文版如何提升API调试效率:本地化优势与开发者实战体验汇总
后端
用户8122199367224 小时前
C# .Net Core零基础从入门到精通实战教程全集【190课】
后端
bobz9654 小时前
FROM scratch: docker 构建方式分析
后端