簡體   English   中英

Log4j dailyrollingfileappender文件問題

[英]Log4j dailyrollingfileappender file issues

我們遇到了一個特殊的問題。 場景:我們有3台服務器,它們有一個組件的多個實例都將事務日志寫入單個日志文件。我們使用log4j,服務器在Java 1.3中運行。 setAppend()傳遞true,實現是DailyRollingFileAppender

問題:在午夜,我們期望當前日志文件以新文件名翻轉並開始寫入新文件。 這在我們的測試設置(單服務器寫日志)中運行良好。 在生產中,午夜時分,新文件將被創建,新文件將被寫入,但滾動文件將被刪除

任何幫助將受到高度贊賞,因為它已經過了幾天,我們無法獲得任何問題的線索。

不應該從許多進程登錄到同一文件。 Log4j可以是線程安全的,但如果我這么說的話,它不是過程安全的。 它不能作為不同java進程之間的共享庫。 嵌入在一個java應用程序中的Log4j不知道任何其他的。

通過翻轉,它會導致您剛剛發現的問題:所有進程都會運行自己的翻轉代碼,盲目地覆蓋以前的內容(因為它們都不需要)。

這里有一個可能的解決方案: Log4j登錄到共享日志文件

假設您已將DailyRollingFileAppender配置為每日輪換(可以配置為每小時,每分鍾等輪換)。 比如,今天是2014年12月31日,日志文件名是sample.log 日志輪換將以下列方式發生:

  • 午夜之后收到的第一條日志消息(例如2015年1月1日凌晨1點)將觸發日志文件輪換。
  • 日志文件輪換將首先刪除具有前一天后綴的任何現有文件。 (即它將刪除名為sample-2014-12-31.log的任何文件。理想情況下,不應存在此類文件。)。
  • 然后它將使用前一天的后綴重命名當前文件。 即它將sample.log重命名為sample-2014-12-31.log
  • 它將創建沒有后綴的新日志文件。 即new sample.log
  • 它將開始寫入新文件sample.log

如果兩個Log Manager實例指向同一個日志文件,則每個實例將獨立地在同一文件上重復上述步驟。 這可能發生在以下任何情況中:

  • 如果部署在同一容器中的兩個或多個WAR文件指向同一個日志文件。
  • 如果兩個或多個進程指向同一個日志文件。
  • 等等

這種情況導致問題中提到的問題。

  • 在Windows機器上,一旦第一個進程旋轉了日志文件並獲取了新文件的句柄,第二個日志追加器將無法寫入日志。
  • 在Linux機器上,第二個進程將刪除第一個進程創建的存檔文件,並將新文件(當前正由第一個進程使用)重命名為前一天文件。 因此,第一個進程將開始在前一天的文件中寫入日志,第二個進程將在新文件中寫入日志。 午夜過后,第一個進程使用的日志文件將被刪除。 因此,來自第一個進程的日志將不斷丟失。

我們遇到了同樣的問題。 根本問題是沒有辦法在多個進程之間協調對日志文件的訪問(在這種情況下在多個服務器上運行。)這意味着會發生各種不好的事情:日志被覆蓋,文件無法滾動等等......

我的建議是讓每個服務器寫入一個單獨的文件,然后在后處理作業中合並它們。

暫無
暫無

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

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