当前位置: 首页 > news >正文

Loggers 配置解析(log4j.xml)

Loggers 配置解析

我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。

<Loggers><!-- 根Logger:全局配置 --><Root level="debug"><AppenderRef ref="consoleAppender" level="info"/><AppenderRef ref="allFileAppender" level="all"/><AppenderRef ref="debugFileAppender" level="debug"/><AppenderRef ref="infoFileAppender" level="info"/><AppenderRef ref="warnFileAppender" level="warn"/><AppenderRef ref="errorFileAppender" level="error"/></Root><!-- 自定义Logger:特定模块配置 --><Logger level="trace" name="com.ruoyi.admin.log"><AppenderRef ref="allFileAppender" level="all"/></Logger></Loggers>

这个配置结合了根 Logger 和自定义 Logger,并实现了分模块、分级别的日志记录策略。理解关键在于层级关系、继承机制和级别过滤的相互作用。

日志输出规则

  1. 层级继承
    • 所有 Logger 默认继承根 Logger 配置
    • com.ruoyi.admin.log及其子包的日志优先使用自定义 Logger 配置。即有子类的情况优先采用子类定义的规则。这点可以类比 Java 中的父类与子类关系。
  2. additivity 属性
    • 未显式设置时默认为 true(即日志会同时传递给自定义 Logger 和根 Logger)
    • 这可能导致重复记录(稍后详解)
  3. 双层过滤
    日志需通过:
    • Logger 级别过滤(第一层)
    • Appender 级别过滤(第二层)

各 Appender 输出内容分析

1. 根 Logger 的 Appender(处理非 com.ruoyi.admin.log 包日志)
Appender输出内容实际输出级别范围
consoleAppender所有包的INFO+日志INFO, WARN, ERROR, FATAL
allFileAppender所有包的DEBUG+日志(不包含TRACE)DEBUG, INFO, WARN, ERROR
debugFileAppender所有包的DEBUG+日志DEBUG, INFO, WARN, ERROR
infoFileAppender所有包的INFO+日志INFO, WARN, ERROR, FATAL
warnFileAppender所有包的WARN+日志WARN, ERROR, FATAL
errorFileAppender所有包的ERROR+日志ERROR, FATAL

📌 注意:根Logger的level="debug"过滤掉了TRACE日志,因此allFileAppender也捕获不到TRACE

2. 自定义Logger的Appender(专用于com.ruoyi.admin.log包)
Appender输出内容实际输出级别范围
allFileAppendercom.ruoyi.admin.log包的TRACE+日志TRACE, DEBUG, INFO, WARN, ERROR
3. 关键交叉点:com.ruoyi.admin.log包的日志

由于additivity=true(默认),该包的日志会同时被:

  • 自定义Logger处理
  • 根Logger处理
com.ruoyi.admin.log日志
自定义Logger
根Logger
allFileAppender
根Logger的所有Appender
具体输出示例(以DEBUG日志为例)
  1. 自定义Logger路径
    DEBUG日志 → 通过trace级别 → allFileAppender(level=all) → 输出
  2. 根Logger路径
    DEBUG日志 → 通过debug级别 → 根Logger的Appender二次过滤:
    • allFileAppender(level=all) → 输出
    • debugFileAppender(level=debug) → 输出
    • infoFileAppender(level=info) → 丢弃
    • …其他同理
结果:重复记录问题

allFileAppender 会记录两次 com.ruoyi.admin.log 的DEBUG日志,表现为 allFileAppender 指定的日志输出文件中会打印两次相同的日志。

  1. 来自自定义Logger
  2. 来自根Logger

优化建议:避免重复记录

增加additivity="false"属性:

<Logger level="trace" name="com.ruoyi.admin.log" additivity="false"><AppenderRef ref="allFileAppender" level="all"/>
</Logger>

优化后效果:

日志来源allFileAppender其他Appender
com.ruoyi.admin.log根Logger的DEBUG+日志按各自级别过滤
com.ruoyi.admin.log该包的TRACE+日志不再出现

即只有 allFileAppender 能输出 com.runyi.admin.log 及其子包中的日志。

最终输出总结(优化后配置)

Appender输出内容覆盖范围
consoleAppender全局INFO+日志(不含特殊包)非特殊包
allFileAppender全局DEBUG+日志 + 特殊包TRACE+日志所有包,不同级别
debugFileAppender全局DEBUG+日志(不含特殊包)非特殊包
infoFileAppender全局INFO+日志(不含特殊包)非特殊包
warnFileAppender全局WARN+日志(不含特殊包)非特殊包
errorFileAppender全局ERROR+日志(不含特殊包)非特殊包

特殊包:com.ruoyi.admin.log及其子包

这种配置实现了:

  1. 生产环境安全:默认只记录DEBUG+日志
  2. 关键模块追踪:特定包记录最详细的TRACE日志。可以调试用。
  3. 分类存储:不同级别日志分离到不同文件
  4. 控制台精简:只显示INFO+关键信息

相关文章:

  • Vue3 + Axios + Ant Design Vue 请求封装详解教程(含 Token 鉴权、加密、下载)
  • 经典俄罗斯方块微信小游戏流量主小程序开源
  • Vue.js 计算属性详解:核心概念、最佳实践与注意事项
  • 宇鹿家政服务系统小程序ThinkPHP+UniApp
  • 责任链模式详解
  • 音视频之H.264视频编码传输及其在移动通信中的应用
  • [AJAX 实战] 图书管理系统下 编辑图书
  • 锌锭工业相机:迁移科技驱动金属制造自动化新高度
  • CppCon 2017 学习:Everything You Ever Wanted to Know about DLLs
  • 打破物理桎梏:CAN-ETH网关如何用UDP封装重构工业网络边界
  • 破局基建困局:国有平台公司数字化转型的生态重构
  • 网页后端开发(基础5--JDBC VS Mybatis)
  • 二叉树基本学习
  • API 接口:程序世界的通用语言与交互基因
  • ABI与API定义及区别
  • JVM内存模型与Arthas诊断实战
  • AR/VR显示为何视场受限?OAS对标波导案例来解决
  • Ubuntu 和 CentOS 中配置静态 IP
  • 微信小程序获取指定元素,滚动页面到指定位置
  • 为什么主动关闭 TCP 连接的一方需要 TIME_WAIT 状态?
  • 沈阳网站建设技术支持/seo排名工具给您好的建议下载官网
  • 腾脉网建站/seo网络营销推广公司深圳
  • 定西网站建设公司排名照片/上街网络推广
  • 工商营业执照查询网上查询/seo排名第一的企业
  • 数据推广是干什么的/seo关键词工具
  • 济南好的网站建设公司/网络推广的主要内容