当前位置: 首页 > 面试题库 >

Log4J RollingFileAppender无法滚动文件

公冶泰
2023-03-14
问题内容

我正在用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就会知道如何同步对滚动附加程序配置所指向的物理文件的访问。当滚动的时间到了时,滚动就没有问题了。

一旦具有两个(或多个)Log4J“配置领域”并将相同的物理文件用于滚动追加程序配置,事情就会成问题。可能是:

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

(等等)

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

这是使用文件追加器的一个已知限制,您不能为此真正归咎于Log4J:除了相同“配置领域”中的Log4J之外,Log4J根本无法监视还有谁在使用该文件。

对于这种使用情况,可以使用Log4J套接字附加程序。

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



 类似资料:
  • 我使用log4j2并试图日志与对数旋转。具体来说,我想以10MB的最大大小登录,并无限制地旋转。下面的配置生成3代滚动文件,因为“DefaultRolloverStrategy max”设置为3。你能指导我如何在最大10MB的大小下记录无限数量的文件吗?

  • 问题内容: 我创建了一个简单的 CollapsingToolbarLayout ,它的工作原理很像。我的问题是,如果我尝试在 nestedscrollview 上使用 浮动 滚动,则在松开手指时它会停止。正常的滚动工作应该像它应该的那样。 我的活动代码未 更改= >自动生成的空活动。(我只是单击了在android studio中创建新的空活动并编辑了XML)。 我在这里读到,imageview上的

  • 问题内容: 尝试使用selenium-webdriver python向下滚动到页面底部,以便加载更多产品。 该网页已加载,但没有变化。 我想念什么吗? 问题答案: 您可以尝试以下move_up和move_down函数:

  • 我有一个页面的正文在滚动。也就是说,body上的滚动事件侦听器起作用。但是,window和document上的滚动侦听器不会激发。 问题是,即使body是滚动的,$(“body”).scrolltop()始终返回0。我循环遍历了body的所有子级,没有一个scrollTop()大于0。有些孩子有溢出:隐藏,但应该不会影响滚动顶部,我猜。 我删除了高度:100%根据这个问题,我也经历了这个问题。 我

  • 无限滚动用来在页面滚动到接近底部时加载新内容或进行其他操作。 在底部的无限滚动 你只需在可滚动的容器上添加“infinite-scroll”类,一般是页面滚动区域 - div.content <style type="text/css"> .infinite-scroll-preloader { margin-top:-20px; } </style> <heade

  • 无限滚动用来在页面滚动到接近底部时加载新内容或进行其他操作。 无限滚动HTML结构 你只需在可滚动的容器上添加“infinite-scroll”类,一般是页面滚动区域 - <div class="page-content">: <div class="page"> <div class="page-content infinite-scroll" data-distance="100">