【问题标题】:using Logger.getGlobal() with tomcat9 and org.apache.logging.log4j.jul.LogManager - log4j config is ignored使用 Logger.getGlobal() 与 tomcat9 和 org.apache.logging.log4j.jul.LogManager - log4j 配置被忽略
【发布时间】:2020-12-27 00:48:48
【问题描述】:

我们有一个带有遗留应用程序的 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.getLogger(LoggingTest.class.getName());

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

Logger.getGlobal().log(Level.INFO, "bar with global"); Logger.getAnonymousLogger().log(Level.INFO, "匿名栏");

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

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

【问题讨论】:

    标签: java tomcat logging log4j


    【解决方案1】:

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

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

    【讨论】:

    • 嗨 - 是的,你是对的 - 我的全局记录器示例是错误的,我已修复它。如果我理解正确,setParent 记录器也会被忽略(遗留代码提供了一个钩子方法来配置已经创建的 java.util.logging.Logger 所以我的想法是通过管理器传递一个记录器创建):logging.apache.org/log4j/log4j-2.2/log4j-jul/apidocs/org/apache/….
    • 感谢您的确认 - 我现在将尝试向记录器添加一个 slf4j 处理程序(也应该适用于 java.util.logging.Logger)并使用 slf4-jul 桥接器。
    • 我会发布它是否有效 - 如果你有兴趣:)
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多