log4j2:运行时重新配置记录器的问题

Posted

技术标签:

【中文标题】log4j2:运行时重新配置记录器的问题【英文标题】:log4j2 : Problem with reconfiguration of the loggers during runtime 【发布时间】:2020-08-06 18:27:38 【问题描述】:

这与 log4j2 版本 2.13.2 有关。

我们正在使用一个带有它自己的记录器配置文件的 API - log4j2_api.xml。 作为应用程序开发人员,我们在类路径中有自己的 log4j2.xml

我们使用的 API 在内部从 log4j2_api.xml 加载 log4j2 实体(记录器和附加程序)。 看起来当这种情况发生时,我们自己的 log4j2.xml 配置被 log4j2_api.xml 覆盖,我们的应用程序不再生成日志。

这是一个简短的事件序列 -

    应用程序启动并从类路径加载 log4j2.xml。 应用程序按预期继续进行适当的日志记录。 发生第一次 API 调用。 log4j2_api.xml 会在内部加载,API 日志记录会根据其配置进行。 应用程序从 API 接收所需数据并继续执行,但没有所需的日志记录。

我的期望是 - 如果在新配置中发现预加载(通过初始配置)记录器/附加器,它们应该被更新,而其他的应该保持不变。当然,应该添加新配置的记录器/附加器。

这种理解正确吗?

提前致谢。

配置文件 -

log4j2.xml

<Configuration status="warn">
    <Appenders>
        <RollingFile name="applicationAppender" fileName="sample-log-executor-2008.log" filePattern="sample-log-executor-2008-%i.log">      
            <PatternLayout>
                <pattern>[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n</pattern>
            </PatternLayout>
            
            <Policies>
                <SizeBasedTriggeringPolicy size="5 MB" />
            </Policies>
        </RollingFile>
        
        <Console name="console_window" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n" />
        </Console>
    </Appenders>
    
    <Loggers>
        <Logger name="com.abc.samplecode" level="trace" additivity="false">
            <appender-ref ref="applicationAppender" level="trace" />
        </Logger>

        <Root level="error" additivity="false">
            <appender-ref ref="console_window" />
        </Root>
    </Loggers>
</Configuration>

log4j_api.xml

<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d %-5p [%t] %C (%F:%L) - %m%n" />
        </Console>
        
        <RollingFile name="xyzAPIAppender" fileName="xyzAPILog.log"
            filePattern="xyzAPILog-%i.log">
            <PatternLayout
                pattern="%dMMM dd yyyy HH:mm:ss.SSS %-5p [%t] (%27F:%-5L) - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="5 MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    
    <Loggers>
        <logger name="com.xyz.api" level="warn"
            additivity="false">
            <AppenderRef ref="xyzAPIAppender" />
        </logger>
    </Loggers>
</Configuration>

【问题讨论】:

如果 API 代码正在加载非默认配置文件名称 log4j2_api.xml - 必须有自定义代码,您能否分享一些了解正在发生的事情的细节。实际的 xmls / API 记录相关部分 我已经用配置文件 sn-ps 更新了这个问题。谢谢! 【参考方案1】:

我怀疑你的类路径中缺少 log4j2 核心 jar。

更多详情请查看拱门 http://logging.apache.org/log4j/2.x/faq.html#which_jars

【讨论】:

没有。它存在。 (我们有一个胖应用程序jar,我可以看到这些类。) 好的,那么可以粘贴这两个xml的配置吗?【参考方案2】:

根据您所描述的库,您正在使用调用 Log4j 来配置它自己的配置。这是非常粗鲁的,因为它会导致您遇到的问题。当它加载其配置时,它正在重新配置 Log4j,因此您的配置将被删除。

您需要获取有关您正在调用的库的更多信息,并了解如何让它停止重新初始化 Log4j。

【讨论】:

以上是关于log4j2:运行时重新配置记录器的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IDE 中使用一个 log4j2 配置文件进行运行时,使用另一个 log4j2 配置文件进行打包/部署?

是否可以在运行时使用不同的 FirebaseOptions 重新配置 FirebaseApp 以记录 Analytics 事件?

Log4j2异步日志背后的数字

如何以编程方式在运行时添加 Log4J2 附加程序?

将 feign 和 Ribbon 日志重定向到 log4j2

SpringBoot + Log4j2使用配置 (转)