繁体   English   中英

使用 Logger.getGlobal() 与 tomcat9 和 org.apache.logging.log4j.jul.LogManager - log4j 配置被忽略

[英]using Logger.getGlobal() with tomcat9 and org.apache.logging.log4j.jul.LogManager - log4j config is ignored

我们有一个带有旧应用程序的 tomcat9,使用 jul 进行日志记录运行。 为了能够更轻松地控制日志格式并拥有 MDC 和其他一些功能,我们使用 org.apache.logging.log4j.jul.LogManager 和一个 log4j 配置文件,如下所示:

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j.configurationFile="\\path\\to\\file\\log4j2.xml

这对于通过 Logger log = Logger.getLogger(LoggingTest.class.getName()); 获取的所有记录器都非常有效。

但在遗留代码中,也有 GlobalLogger 以及匿名记录器,例如这样使用(简化但重现了问题):

Logger.getGlobal().log(Level.INFO, "bar with global"); Logger.getAnonymousLogger().log(Level.INFO, "bar with anonymous");

这些不是通过 log4j 记录,而是直接使用 Java Util 完全忽略 LogManager。 在这些情况下返回的记录器不是 org.apache.logging.log4j.jul.CoreLogger 的实例而是 java.util.logging.Logger,尽管它的管理器仍然是 org.apache.logging.log4j.jul.LogManager。

这是一个已知的限制和/或是否有解决方法?

查看源代码,它看起来像 Logger.getAnonymousLogger() 直接执行 new Logger() 而不是通过 LogManager。 这使得 Log4j 的替代 LogManager 无法正确支持这一点,因为 Log4j 期望它的 LogManager 替代创建记录器。

GlobalLogger 似乎也在初始化期间使用新的 Logger() 调用进行设置。 但是,在上面的代码中,您显示您正在针对 Global Logger 调用 getLogger(),这有点有趣,因为 getLogger() 是一个静态方法,其行为应该与 Logger.getLogger() 一样,最终调用 LogManager 来获取一个 Logger,所以在这种情况下,我不知道为什么你也不会得到一个 Log4j CoreLogger。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM