[英]Log4j dailyrollingfileappender file issues
我們遇到了一個特殊的問題。 場景:我們有3台服務器,它們有一個組件的多個實例都將事務日志寫入單個日志文件。我們使用log4j,服務器在Java 1.3中運行。 setAppend()傳遞true,實現是DailyRollingFileAppender
問題:在午夜,我們期望當前日志文件以新文件名翻轉並開始寫入新文件。 這在我們的測試設置(單服務器寫日志)中運行良好。 在生產中,午夜時分,新文件將被創建,新文件將被寫入,但滾動文件將被刪除
任何幫助將受到高度贊賞,因為它已經過了幾天,我們無法獲得任何問題的線索。
您不應該從許多進程登錄到同一文件。 Log4j可以是線程安全的,但如果我這么說的話,它不是過程安全的。 它不能作為不同java進程之間的共享庫。 嵌入在一個java應用程序中的Log4j不知道任何其他的。
通過翻轉,它會導致您剛剛發現的問題:所有進程都會運行自己的翻轉代碼,盲目地覆蓋以前的內容(因為它們都不需要)。
這里有一個可能的解決方案: Log4j登錄到共享日志文件
假設您已將DailyRollingFileAppender配置為每日輪換(可以配置為每小時,每分鍾等輪換)。 比如,今天是2014年12月31日,日志文件名是sample.log 。 日志輪換將以下列方式發生:
如果兩個Log Manager實例指向同一個日志文件,則每個實例將獨立地在同一文件上重復上述步驟。 這可能發生在以下任何情況中:
這種情況導致問題中提到的問題。
我們遇到了同樣的問題。 根本問題是沒有辦法在多個進程之間協調對日志文件的訪問(在這種情況下在多個服務器上運行。)這意味着會發生各種不好的事情:日志被覆蓋,文件無法滾動等等......
我的建議是讓每個服務器寫入一個單獨的文件,然后在后處理作業中合並它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.