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 事件?