从 log4j 1.2.17 迁移后的 log4j 2.2 问题

Posted

技术标签:

【中文标题】从 log4j 1.2.17 迁移后的 log4j 2.2 问题【英文标题】:log4j 2.2 issues after migrating from log4j 1.2.17 【发布时间】:2015-04-02 11:44:48 【问题描述】:

我已经从 log4j 1.2.17 迁移到 log4j 2.2。我遇到了以下问题:

    我的 AsyncLogger 就像一个同步的一样工作。这是我对这个记录器的配置:

    %m%dyyyy-MM-dd HH:mm:ss%n 图案布局> 滚动文件>

日志创建是正确的,但是我记录到这个文件的所有内容都没有被缓冲,并且这些行被立即提交。我已经将我的配置与我在其他帖子中看到的其他配置进行了比较,但我看不出有什么问题。

    当我关闭我的应用程序时,现在我收到以下错误:

线程“pool-1-thread-1”中的异常 java.lang.NoClassDefFoundError: org/apache/logging/log4j/message/ParameterizedMessage 在 org.apache.logging.log4j.message.ParameterizedMessageFactory.newMessage(ParameterizedMessageFactory.java:47) 在 org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:737) 在 org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:708) 在 org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:314) 在 org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry.run(DefaultShutdownCallbackRegistry.java:77) 在 java.lang.Thread.run(Thread.java:745) 引起:java.lang.ClassNotFoundException:org.apache.logging.log4j.message.ParameterizedMessage 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) ... 6 更多

当出现此错误时,我没有记录任何内容。我记录的最后一行在其相应的日志中正确显示。

    使用同步记录器记录到文件时,偶尔会出现奇怪的字符。请参见下文“^[[?1;2c^[[?1;2c”(1.2.17 没有发生这种情况)。

2015-04-02 13:58:51 启动消息服务...

^[[?1;2c^[[?1;2c2015-04-02 13:59:06 消息服务启动成功。

2015-04-02 13:59:06 启动平衡器测试端口...

2015-04-02 13:59:06 Balancer 测试端口成功启动。

提前致谢。

琼。

【问题讨论】:

我看到您为问题 #3 创建了一个单独的问题。谢谢你。如果已回答,您可以关闭此问题吗? 【参考方案1】:

    这是预期的行为。后台线程只是跟上应用程序放入队列的日志事件。请注意,使用 log4j2,如果队列为空,异步日志记录将刷新缓冲区,因此结果会立即在磁盘上可见。 (请参阅FileAppender immediateFlush 的文档。)

    您可能需要将 log4j-web 模块添加到您的部署中。这是清理 Web 应用程序中的 log4j 资源所必需的,并且还会禁用关闭挂钩。见https://logging.apache.org/log4j/2.x/manual/webapp.html

    这个比较棘手...你能提供完整的 log4j2 配置吗?有没有可能有 2 个进程写入同一个文件?

【讨论】:

感谢您的快速回复 Remko。关于第2点,现在它似乎工作正常,但是关闭Tomcat时出现此消息(可能是正常的):严重:Web应用程序[]似乎已经启动了一个名为[AsyncLoggerConfig-1]的线程,但未能停止它.这很可能造成内存泄漏。关于第 3 点,这里是我的 log4j.xml 的链接:ventusproxy.com/download/log4j.xml。不,当我的应用程序启动时,只有同一个(也是唯一一个)线程正在写入日志。 看来这些奇怪的字符只出现在vproxy_system日志(SYSTEM_LOG appender)中。 抱歉,还有一件事……使用 log4j,我可以用当前日期命名我的目标日志文件。我的意思是,如果今天是 2015-04-04,那么今天的日志文件是 vproxy.2015-04-04。在 00:00,创建了一个名为 vproxy.2015-04-05 的新文件,我的应用程序开始登录它。但似乎这对于 log4j2 是不可能的。我错了吗? 在 fileName 属性值的日期查找中可能需要两个 $$ 字符:fileName="$sys:log.dirvproxy_access.$$date:yyyy-MM-dd" 我已经尝试过了,它创建了一个名为“vproxy_access.$date:yyyy-MM-dd”的文件。

以上是关于从 log4j 1.2.17 迁移后的 log4j 2.2 问题的主要内容,如果未能解决你的问题,请参考以下文章

log4j 2.16.0 中 log4j 1.2.17 中 LogManager.setRepositorySelector() 的替代方案

将 log4j.properties 文件从 Log4j 版本 1 迁移到 2 的合适指南

将项目从 log4j 迁移到 slf4j+log4j

从log4j日志无缝迁移至logback

log4j 2 迁移桥 log4j-1.2-api.jar 缺少类

将 log4j 1.2.x 迁移到 log4j 2.16.0