首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >针对log4j1编写的组件在log4j2升级后不进行日志记录

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

Stack Overflow用户
提问于 2016-06-30 07:52:55
回答 3查看 4K关注 0票数 3

几天来我一直在想这件事,却弄不清楚。如果添加Log4j2兼容性库,则log4j1是向后兼容的。

我的\lib有:

  • slf-api
  • log4j-1.2-api (反向计算)。图书馆)
  • log4j-api (log4j2)
  • Log4j核(log4j2)
  • log4j-web (用于web应用程序的自动布线)

我的web.xml有:

代码语言:javascript
运行
AI代码解释
复制
<!-- 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是:

代码语言:javascript
运行
AI代码解释
复制
<?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除外)。警告是:

代码语言:javascript
运行
AI代码解释
复制
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.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-01 07:09:46

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

我能做到这一点的唯一方法是:

  1. 同时创建一个log4j1和log4j2 XML配置文件(即使log4j2配置包含我想要的所有记录器)
  2. 让Log4j2通过'log4j-web‘工件+ 'log4jConfiguration’web.xml参数自动连接自己
  3. 通过调用不推荐的log4j1 (.)手动连接Log4jConfigurer.initLogging服务器启动时的API

这可能是可怕的不正确,但如上所述,这是唯一的方式,我让它工作了几个星期左右。

我对lo4j1桥的理解是,连接log4j2并包含该桥是应该需要的(例如,不需要手动连接log4j1)。在实践中,这种情况似乎没有发生。

票数 3
EN

Stack Overflow用户

发布于 2016-06-30 12:32:45

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

票数 1
EN

Stack Overflow用户

发布于 2016-06-30 14:46:57

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38128035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档