Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4J RollingFileAppender无法滚动文件_Java_Multithreading_Logging_Log4j - Fatal编程技术网

Java Log4J RollingFileAppender无法滚动文件

Java Log4J RollingFileAppender无法滚动文件,java,multithreading,logging,log4j,Java,Multithreading,Logging,Log4j,我正在用Java编写一个小型xml转换层。我通过web服务接收xml,修改它,然后将修改后的xml发送到另一个系统。然后我等待响应并将响应返回给原始调用方 System A -> Me -> System B -> Me -> System A 我想记录我收到的请求、我发送的请求、我收到的响应和我发送的请求。基本上,我想记录图表中每个箭头所在的xml 我的问题是RollingFileAppender。我尝试以10MB的速度滚动,有时滚动,有时不滚动。如果它滚动几次,然后

我正在用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配置,事情就会变得有问题。这可能是:

  • 同一物理JVM上的两个不同web应用程序
  • 两个不同JVM上的两个不同web应用程序
  • 同一web应用程序水平集群在两个不同的JVM上
  • (等)

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

    这是使用文件附加器的一个已知限制,您不能因此责备Log4J:Log4J根本没有办法监视除了同一“配置域”中的Log4J之外的其他人在使用该文件

    对于这种使用场景,您可以使用Log4J套接字appender


    如果您的场景不涉及多个Log4J“配置域”,那么请尝试将
    -Dlog4j.debug=true
    添加到JVM参数中,并查看文件滚动操作期间的具体情况。

    我在应用程序中也遇到了同样的问题

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

    对于到达此处的其他人,请检查您使用的是RollingFileAppender而不是FileAppender


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

    谢谢你的详细解释。我知道我做错了什么,以及今后如何避免。我知道这不可能是Log4J的错@Isaac你能告诉我我应该添加哪一行“JVM参数”
    -Dlog4j.debug=true
    ?为什么在回答问题一年后还要添加注释?我清楚地表明我正在使用RollingFileAppender。这是为像我这样的人设计的,他们正在寻找一个模糊技术问题的答案,而他们实际上刚刚犯了一个愚蠢的错误。