java - 针对 log4j1 编写的组件在 log4j2 升级后未记录

标签 java tomcat log4j log4j2

几天来,我一直在为这个问题苦苦思索,却无法弄明白。如果添加 log4j1 兼容库,Log4j2 是向后兼容的。

我的 web-inf\lib 有:

  • slf-api
  • log4j-1.2-api(向后兼容库)
  • log4j-api (log4j2)
  • log4j-核心 (log4j2)
  • log4j-web(Web 应用程序的 Autowiring )

我的 web.xml 有:

<!-- log4j2 auto-wiring -->
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>file:///${catalina.base}/conf/log4j2.xml</param-value>
</context-param>

我的 [tomcat]/conf/log4j2.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
    <Appenders>
        <!-- Appends to CONSOLE -->
        <Console name="consoleAppender" target="SYSTEM_OUT">
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%5p (%F:%L) - %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.mycompany.componentA" level="WARN" />
        <Logger name="com.mycompany.componentA.QueryLogger" level="DEBUG" />
        <Logger name="com.mycompany.mycode" level="DEBUG" />
        <Root level="WARN">
            <AppenderRef ref="consoleAppender" />
        </Root>
    </Loggers>
</Configuration>

我已将我控制下的代码 (com.mycompany.mycode) 升级为 log4j2 API,它们可以完美地工作/记录。不受我控制但针对 log4j1 (com.mycompany.componentA) 编写的代码根本无法登录。没有错误,没有调试,什么都没有。

但有趣的是...当我启动该应用程序时,我收到一条 log4j1 警告,提示该应用程序启动时配置不正确。这也让我感到难过,因为 WAR 中没有 log4j1 库(兼容性 API 除外)。警告是:

log4j:WARN No appenders could be found for logger (com.mycompany.componentB) 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

最佳答案

编辑:我(终于)弄清楚发生了什么。我的一个依赖项做了一件非常糟糕的事情,并将 log4j1 类捆绑到它的最终 jar 中。所以类路径上没有log4j1 jar,但是类路径上有log4j1 CLASSES。

我能够让这个工作的唯一方法是:

  1. 同时创建 log4j1 和 log4j2 XML 配置文件(即使 log4j2 配置包含我想要的所有记录器)
  2. 让 Log4j2 通过“log4j-web”工件 +“log4jConfiguration”web.xml 参数 Autowiring 自身
  3. 通过在服务器启动时调用已弃用的 Log4jConfigurer.initLogging(...) API 手动连接 log4j1

这可能是非常不正确的,但正如上面所指出的,这是我在数周的闲逛之后让它工作的唯一方法。

我对 lo4j1 网桥的理解是连接 log4j2 并包括网桥是所有应该需要的(例如,不需要手动连接 log4j1)。实际上,这似乎并没有发生。

关于java - 针对 log4j1 编写的组件在 log4j2 升级后未记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38128035/

相关文章:

java - log4j2 - Syslog appender 和 PatternLayout

java - HashMap 中的 Double

java - 设置mysql进程之间的优先级

为什么 Tomcat 7.0.47 不断抛出错误?

java - 项目无法在装有最新版本的 Netbeans 和 Java SE 开发工具包的新 PC 上启动

java - 自定义 Log4j 文件名

java - Google App Engine/GWT/Eclipse 插件新手问题-如何自动构建客户端资源?

java - 如何在 JUnit 5 中使用少量枚举创建参数化测试?

tomcat - netbeans tomcat清除日志文件

Tomcat6 - 如何通过 log4j 或 JULI 获取 session 参数?