Java 针对log4j1编写的组件在log4j2升级后不进行日志记录

Java 针对log4j1编写的组件在log4j2升级后不进行日志记录,java,tomcat,log4j,log4j2,Java,Tomcat,Log4j,Log4j2,这件事我已经忙了好几天了,还没弄明白。如果添加log4j1兼容性库,则Log4j2向后兼容 我的web inf\lib有: slf api log4j-1.2-api(向后兼容库) log4j api(log4j2) log4j堆芯(log4j2) log4j web(web应用程序的自动布线) My web.xml具有: <!-- log4j2 auto-wiring --> <context-param> <param-name>log4jCo

这件事我已经忙了好几天了,还没弄明白。如果添加log4j1兼容性库,则Log4j2向后兼容

我的web inf\lib有:

  • slf api
  • log4j-1.2-api(向后兼容库)
  • log4j api(log4j2)
  • log4j堆芯(log4j2)
  • log4j web(web应用程序的自动布线)
My web.xml具有:

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

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

如果不在WEB-INF/lib中,那么可能在您的WEB容器(Tomcat?)共享lib文件夹中?Ralph是对的,这个错误消息是由Log4j-1.2生成的,所以它在类路径的某个地方。。。如有必要,请尝试打印系统属性
java.class.path
的值


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

(我最初建议使用
Category
,但这也存在于log4j1桥中,因此
AppenderSkeleton
更好。)

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

我能让这项工作正常进行的唯一方法是:

  • 创建log4j1和log4j2 XML配置文件(即使log4j2配置包含我想要的所有记录器)
  • 让Log4j2通过'log4jweb'工件+'log4jConfiguration'web.xml参数自动连接自身
  • 通过在服务器启动时调用不推荐使用的log4jconfig.initLogging(…)API,手动连接log4j1
  • 这可能是非常不正确的,但如上所述,这是我在几周的闲逛后让它工作的唯一方法


    我对lo4j1电桥的理解是,只需要连接log4j2并包括电桥(例如,无需手动连接log4j1)。实际上,这种情况似乎没有发生。

    根据总结,我在WebInf中没有任何log4j1库。您看到的消息来自log4j 1.x的初始化代码,因此它必须位于classparh中的某个位置。继续查找,直到找到它。我们的答案有用吗?这证实了Ralph和我的假设,即log4j1 jar仍然在类路径中。用另一种方法更新了我的答案,以找到Log4j 1 jar的位置。不,它没有证实这一点。所有log4j1 API调用都桥接到log4j2调用。因此,它真正确认的是,您对什么地方出了问题没有我知道的更多。
    log4jconfigure
    只存在于log4j1 jar中。它不包括在log4j-1.2-api-2.x桥中。Log4j 2忽略log4j1配置。如果你需要一个Log4j 1配置和一个Log4j 2配置文件来让你的应用程序工作,那么你的类路径中有一个Log4j 1。不幸的是,再次出现错误。它是Spring框架的一部分。
    <?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>
    
    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.