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 即可解决通过优化性能、安全性和兼容性,确保日志系统在企业级应用中稳定运行

相关推荐
David爱编程8 分钟前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术25 分钟前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
小研说技术43 分钟前
Spring AI存储向量数据
后端
苏三的开发日记43 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
陈三一1 小时前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure1 小时前
万字详解JVM
java·jvm·后端
我崽不熬夜1 小时前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜1 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee
我崽不熬夜2 小时前
Java中的基本数据类型和包装类:你了解它们的区别吗?
java·后端·java ee