簡體   English   中英

Log4J RollingFileAppender無法滾動文件

[英]Log4J RollingFileAppender Unable to Roll File

我正在用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參數,並查看文件滾動操作期間到底發生了什么。

對於到達這里的其他人,請檢查您是否正在使用RollingFileAppender而不是FileAppender!

對我來說,剪切和粘貼錯誤太容易了。

我在申請中也面臨同樣的問題。

感謝@Isaac發現我正在為應用服務器中部署的2個Web應用程序中的相同日志配置執行DOMConfigurator.configure。 我對其中一個進行了評論,並按預期發生了滾動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM