当前位置: 首页 > 知识库问答 >
问题:

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

怀晋
2023-03-14

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

我的web-inf\lib有:

  • slf-api
  • log4j-1.2-api(向后比较库)
  • log4j-api(log4j2)
  • log4j-core(log4j2)
  • log4j-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>

My[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)升级到log4j2api,它们可以完美地工作/log。不受我控制但针对log4j1(com.mycompany.componentA)编写的代码根本无法登录。没有错误,没有调试,什么都没有。

不过有些有趣的事。。。当我启动应用程序时,会收到一条关于应用程序启动时配置不正确的log4j1警告。这也让我感到困惑,因为战争中没有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个答案

相弘方
2023-03-14

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

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

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

沃阳飙
2023-03-14

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

齐承运
2023-03-14

编辑:我(终于)明白发生了什么。我的一个依赖项做了一件可怕的坏事,并将log4j1类捆绑到它的最后一个jar中。所以类路径上没有log4j1 jars,但是类路径上有log4j1类。

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

  1. 创建log4j1和log4j2 XML配置文件(即使log4j2配置包含我想要的所有记录器)
  2. 让Log4j2通过“log4jweb”工件“log4jConfiguration”web自动连接自身。xml参数
  3. 通过调用不推荐使用的Log4JConfiguer手动连接log4j1。初始化日志(…)服务器启动时的API

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

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

 类似资料:
  • 我正在将grails 2.5.4应用程序中的log4j依赖项从1.2.17升级到最新版本2.17.1 我从BuildConfig.groovy中排除了log4j,并添加了与v2.17.1相关的以下依赖项: log4j api log4j核心 log4j-1.2-api log4j-slf4j-impl 我用的是log4-1。x桥接以减少总体代码基更改。 我添加了以下log4j2。conf目录下的属

  • 是的,我已经阅读了所有相关的问题。我正在使用log4j2(尝试了2.4版和更新到最新的2.6.2版)。 我有一个面向客户的小型实用程序。我渴望将暴露的配置保持在最低限度。但对于有问题的情况,我还想添加一个标志,以便在运行时启用调试日志。 这是我启用调试日志记录的代码 但它实际上并不适用于这些情况: 实用程序通常在30秒内完成,因此更改应该是即时的。这是log4j2。xml 使用AppenderRe

  • 我已经在weblogic 12c中配置了日志4j2。 我的文件已生成,但日志未写入文件中。我在这里发现了相同的问题,但我的附加器名称相同。我做错了什么? 任何面临同样问题的人。

  • 我正在使用:import org.slf4j.logger;导入org.slf4j.loggerFactory; 有人能帮忙解决问题吗。

  • 编写了简单的POC来证明和测试Spring Boot和log4j2的兼容性。一旦成功,我将把它移动到真正的应用程序。 请参考下面的maven依赖关系(来自POC): 如果我不排除Spring的logback,也不添加boot-starter-log4j2,那么应用程序日志会打印到应用程序文件中,但Spring日志根本不会打印。我感觉到了依赖的问题。感谢任何帮助。