Log4j2主XML与XInclude定义Logger的优先级及合并规则咨询
Log4j2多元素(含XInclude引入)的配置合并规则
核心规则
当通过XInclude将多个配置文件整合成一个完整XML后,Log4j2对多个<Loggers>元素的处理逻辑是后出现的<Loggers>会完全替换之前的所有<Loggers>元素,而非合并其中的单个Logger条目:
- 最终生效的只有最后一个
<Loggers>里的所有配置(包括<Logger>和<Root>); - 之前
<Loggers>中定义过但未在最后一个<Loggers>里出现的Logger会被移除,代码中调用这类Logger时,Log4j2会自动生成继承自Root的默认Logger,级别与当前生效的Root一致。
场景解析
场景1(s1)
合并后的XML配置顺序是:先加载引入文件的<Loggers>(含myLogger1、myLogger2,级别DEBUG),再加载主文件的<Loggers>(仅含Root,级别INFO)。
由于主文件的<Loggers>是最后出现的,引入文件的<Loggers>被完全替换。此时配置里只有Root Logger,myLogger1和myLogger2没有显式定义,代码调用时会生成继承Root的默认Logger,因此级别显示为INFO。
场景2(s2)
合并后的XML配置顺序是:先加载主文件的<Loggers>(含Root,级别INFO),再加载引入文件的<Loggers>(含myLogger1、myLogger2,级别DEBUG)。
最后生效的是引入文件的<Loggers>,其中的myLogger1、myLogger2保留原有DEBUG级别。若引入文件的<Loggers>未定义Root,Log4j2会保留之前配置的Root(INFO级别)——这是因为新的<Loggers>未覆盖Root条目,原有Root配置继续生效。
相关文档章节
- Configuration Syntax > XInclude:说明XInclude会将引入内容插入主配置,形成单一XML文档后再解析;
- Configuration Syntax > Loggers:明确
<Loggers>作为日志器容器,解析时后续的容器会覆盖之前的实例。
内容的提问来源于stack exchange,提问作者Walter Butze
相关产品推荐
相关产品推荐

