首页 文章

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

提问于
浏览
1

几天来,我一直在敲打这个,但是无法弄明白 . 如果添加log4j1兼容性库,则Log4j2向后兼容 .

我的web-inf \ lib有:

  • slf-api

  • log4j-1.2-api(向后兼容库)

  • log4j-api(log4j2)

  • log4j-core(log4j2)

  • log4j-web(Web应用程序的自动连线)

我的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.

3 回答

  • 0

    该错误消息意味着您的应用程序中仍然有log4j-1.x jar . 在您的WEB-INF / lib中查找并删除它然后它应该工作 .

  • 0

    如果不在WEB-INF / lib中,那么可能在你的web容器(Tomcat?)中共享lib文件夹? Ralph是正确的,这个错误消息是由Log4j-1.2生成的,因此它位于类路径的某个地方......如果需要,请尝试打印系统属性 java.class.path 的值 .


    更新:找到Log4j1 jar的位置的另一种方法是从应用程序中打印 org.apache.log4j.AppenderSkeleton.class.getResource("/org/apache/log4j/AppenderSkeleton.class") 的值 .

    (我最初建议 Category 但这也存在于Log4j 1桥中,所以 AppenderSkeleton 更好 . )

  • 0

    编辑:我(终于)弄清楚发生了什么 . 我的一个依赖项做了一个可怕的坏事,并将log4j1类绑定到它的最后一个jar中 . 因此类路径上没有log4j1 jar,但类路径上有log4j1 CLASSES .

    我能够实现这一目标的唯一方法是:

    • 同时创建log4j1和log4j2 XML配置文件(即使log4j2配置包含我想要的所有 Logger )

    • 让Log4j2通过'log4j-web' artifact 'log4jConfiguration' web.xml参数自动连接自身

    • 通过在服务器启动时调用已弃用的Log4jConfigurer.initLogging(...)API手动连接log4j1

    这可能是非常不正确的,但正如上面所说,这是我在经过数周的鬼混之后才开始工作的唯一方式 .

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

相关问题