2014-06-25 105 views
10

我正在用Java編寫一個小的xml轉換層。我通過Web服務接收到XML,對其進行修改,然後將修改後的XML發送到另一個系統。然後我等待響應並將響應返回給原始呼叫者。Log4J RollingFileAppender無法滾動文件

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 

EDIT 2這實質上是一種凸塊,因爲這柱具有的觀點低數量。我覺得這不可能是一個獨特的問題。任何幫助深表感謝。謝謝!

回答

9

在Log4J的類裝載器級別的初始化工作。在某個類加載器及其祖先中,Log4J只能初始化一次,並且相同的Log4J配置適用於類加載器中的所有Log4J調用。

只要你所有的通話記錄是相同的Log4j配置「境界」內進行,Log4J的知道如何訪問物理文件同步指着由滾動的appender配置;當時間到了,滾動沒有問題。一旦你使用了滾動的appender配置相同的物理文件中的兩個(或更多)Log4J的「配置領域」

事情成爲問題。這可能是:在同一個物理JVM

  1. 兩個不同的Web應用程序
  2. 在兩個不同的JVM
  3. 同一Web應用程序在兩個不同的JVM

水平集羣兩個不同的Web應用程序(等)

Log4J根本無法知道除了自己以外的其他人在相同的Log4J配置領域,使用該文件。因此,最終發生的情況是系統A上的Log4J嘗試滾動該文件(因爲它認爲沒有其他進程正在訪問該文件),並且因爲系統B上的某個人同時使用該文件而失敗。這是使用文件appenders的一個已知的限制,而且你不能真正責怪Log4J:Log4J根本沒有辦法監視除Log4J之外的其他人是否在同一個「配置領域」中使用該文件。

對於這樣的使用場景,您可以使用Log4J的插座附加器。

如果您的場景不涉及多個Log4J「配置領域」,那麼請嘗試將-Dlog4j.debug=true添加到JVM參數中,並查看文件滾動操作期間到底發生了什麼。

+0

感謝您的詳細解釋。我看到我做錯了什麼,以及如何避免它在未來。我知道它不可能是Log4J的錯! – Joe

+0

@Joe如果它有任何幫助,我也知道它不可能是Log4J的錯...... – Isaac

+0

@Isaac你能告訴我哪個「JVM參數」應該添加這一行嗎?-Dlog4j.debug = true' ? –

1

我在我的應用程序中也面臨同樣的問題。

感謝@Isaac發現我正在爲在應用程序服務器中部署的兩個Web應用程序中的相同日誌配置執行DOMConfigurator.configure。我評論其中的一個,並按預期發生翻車。

1

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

對於我來說,剪切和粘貼錯誤太簡單了。

+2

爲什麼您在回答問題一年後添加評論?我清楚地表明我正在使用RollingFileAppender。 – Joe

+0

對於像我這樣的人來說,當他們真的犯了一個愚蠢的錯誤時,他們正在尋找一個模糊的技術問題的答案。 –

相關問題