log4j2.xml配置文件详解

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 → 远程收集(仅)

最佳实践

  1. 分级存储: 不同级别日志分文件存储,便于问题定位
  2. 异步处理: 远程日志使用异步模式,避免影响应用性能
  3. 长度限制: 消息最大0.5M,防止超大日志影响系统
  4. 双重保障: 本地 + 远程存储,确保日志可靠性
  5. 监控集成: 集成监控系统,支持实时告警和分析

常见问题

  1. 服务未简化异常日志 : 日志配置文件中存在Appender的PatternLayout标签中增加%ex配置或修改为默认带有%ex的输出格式。
  2. 服务未配置日志丢弃: AsyncScribe配置blocking=false
  3. 未指定单条日志最大输出长度: PatternLayout中使用%.-Xmsg语法,其中X是日志输出的最大长度限制(单位:字符数),比如设置成%.-524288msg表示日志输出的长度最大限制为524288个字符,即0.5M,超出的部分直接截断不做输出。
  4. 服务未异步打印日志: logger和appender修改同步模式为异步模式
  5. 日志配置中禁用Async/Scribe标签: 只要使用了Async/Scribe标签,就有发生线程阻塞的风险
  6. Log4j 生产环境禁止将日志输出到标准输出: 生产环境禁止将日志输出到标准输出,会导致线程阻塞,请在生产环境的配置中移除 Console
相关推荐
uzong2 小时前
系统稳定性保障:研发规约V1.0
后端
Frank_zhou2 小时前
Easy-Es 架构设计详解
后端·elasticsearch
狗头大军之江苏分军3 小时前
Meta万人裁员亲历者自述:小扎尝到了降本的甜头
前端·后端·github
Jagger_3 小时前
SonarQube:提升代码质量的前后端解决方案
前端·后端·ai编程
在逃牛马3 小时前
【Uni-App+SSM 宠物项目实战】Day6:MP 实体类与 Mapper 生成
后端
remaindertime3 小时前
(九)Spring Cloud Alibaba 2023.x:微服务接口文档统一管理与聚合
后端·spring cloud·微服务
Barcke4 小时前
📘 初识 WebFlux
spring boot·后端·spring
JohnYan4 小时前
工作笔记 - 一个浏览器环境适用的类型转换工具
javascript·后端·设计模式
得物技术4 小时前
0基础带你精通Java对象序列化--以Hessian为例|得物技术
java·后端·编程语言