Log4J RollingFileAppender无法滚动文件

我正在用Java编写一个小的xml转换层。 我通过Web服务接收xml,修改它,然后将修改后的xml发送到另一个系统。 然后我等待响应并将响应返回给原始调用者。

System A -> Me -> System B -> Me -> System A 

我想记录收到的请求,发送的请求,收到的响应以及发送的请求。 基本上我想记录每个箭头在我的图表中的xml。

我的问题在于RollingFileAppender。 我尝试以10MB滚动,有时它会滚动,有时它不会滚动。 如果它滚动了几次,然后停止,它将继续将滚动的文件重命名为3到4和4到5,依此类推。

我最好的猜测是,当超过10MB标记时,有多个线程写入日志文件,因此无法重命名该文件。 我希望Log4J有一个简单的解决方案,但如果有必要,我愿意切换到新的日志框架。 预先感谢您的任何帮助。

编辑这是我的属性文件。

 log4j.rootLogger=DEBUG, fileOut log4j.appender.fileOut=org.apache.log4j.RollingFileAppender log4j.appender.fileOut.File=/logs/log.log log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout log4j.appender.fileOut.layout.ConversionPattern=%d %-5p %c - %m%n log4j.appender.fileOut.MaxFileSize=10MB log4j.appender.fileOut.MaxBackupIndex=10 log4j.appender.fileOut.append=true 

编辑2这实际上是一个颠簸,因为这篇文章的观看次数很少。 我觉得这不是一个独特的问题。 任何帮助深表感谢。 谢谢!

Log4J在类加载器级别初始化。 在某个类加载器及其祖先中,Log4J只能初始化一次,相同的Log4J配置适用于类加载器中的所有Log4J调用。

只要所有日志记录调用都在相同的Log4J配置“领域”内执行,Log4J就知道如何同步访问滚动appender配置指向的物理文件; 当滚动时,滚动执行没有问题。

一旦你有两个(或更多)Log4J“配置领域”使用相同的物理文件进行滚动appender配置,事情就会成为问题。 那可能是:

  1. 同一物理JVM上的两个不同的Web应用程序
  2. 两个不同JVM上的两个不同的Web应用程序
  3. 相同的Web应用程序水平集群在两个不同的JVM上

(等等)

Log4J根本无法知道在同一个Log4J配置域中除了它自己以外还有谁使用该文件。 因此,最终发生的事情是系统A上的Log4J尝试滚动文件(因为它认为没有其他进程正在访问该文件),并且因为系统B上有人同时使用该文件而失败。

这是使用文件追加器的一个已知限制,你不能真的责怪Log4J:Log4J根本无法监控除了同一“配置域”中的Log4J之外的其他人正在使用该文件。

对于此类使用方案,您可以使用Log4J套接字appender。

如果您的方案不涉及多个Log4J“配置域”,则尝试将-Dlog4j.debug=true添加到JVM参数,并查看文件滚动操作期间到底发生了什么。

我在申请中也面临同样的问题。

感谢@Isaac发现我正在为应用服务器中部署的2个Web应用程序中的相同日志配置执行DOMConfigurator.configure。 我对其中一个进行了评论,并按预期进行了滚动。

对于到达这里的其他人,请检查您是否正在使用RollingFileAppender而不是FileAppender!

对我来说,剪切和粘贴错误太容易了。