2012-07-06 22 views
1

我正在嘗試使用log4j寫入CSV文件。每次創建CSV頭時,都必須將其寫入日誌文件的頂部。例如,所有這些卷文件必須具備以下爲日誌文件的第一行:如何以編程方式確定log4j中發生翻轉的時間?

log.0時間戳,名稱,最小值,最大值

log.1時間戳,名稱,分鐘,最大

log.2時間戳,名稱,最小值,最大值

是否有可能確定何時發生翻轉,這樣我可以追加頭?

謝謝。

P.S:我知道有很多開源CSV編寫器,但我不喜歡使用它們,因爲我想在我們的軟件中使用現有的日誌功能。

+0

這聽起來不像是個好主意。例如,如果您有多個日誌記錄,或者您的應用程序是多線程的,或者分佈式的。假設您正在討論的事件(檢測日誌文件滾動的時間)存在且可檢測到。不能保證對日誌的寫入將被排序,即您的處理程序將能夠在生成卷的實際日誌條目之前將頭附加到下一個日誌文件。我會堅持使用其他方法,如始終手動/通過腳本將文件頭插入文件。 – Viccari 2012-07-09 23:07:59

+0

好點。在我的情況下,CSV日誌記錄通過一個類,我可以保證同步。看着RollingFileAppender源代碼,事實證明沒有公共API來確定發生翻轉事件。實際上,它只是檢查當前日誌文件是否已達到其最大值(它的副本),刪除當前文件,是否使用指定的文件名創建另一個文件並開始登錄。然而,RollingFileAppender.getFile()可用於知道appender使用的當前文件名,並且您可以檢查文件上的時間戳以瞭解是否發生翻轉。 – partheinstein 2012-07-10 18:45:40

+0

那麼從你的應用程序之外插入(通過腳本或類似的)標題到所有日誌文件一次? – Viccari 2012-07-10 18:49:05

回答

5

如果您查看RollingFileAppender的log4j文檔,它有一個名爲rollOver的方法。

http://logging.apache.org/log4j/1.2/apidocs/index.html

您需要實現從RollingFileAppender進行繼承的自定義文件附加器,並覆蓋側翻方法。我想你可以直接調用super.rollOver,然後在將任何東西記錄到新文件之前,將所需的任何東西寫入新文件的頭部。

+0

的確,這就是我最終做的。我只複製粘貼的RollingFileAppender代碼並添加了一個計數器,每次發生滾動時都會遞增。在RollingFileAppender本身中有這個很好。 – partheinstein 2012-07-11 22:21:45

+0

很高興我能幫上忙(也就是說,如果你在我回答之前沒有自己弄清楚這一點)。如果這是正確的答案,你能把它標記爲正確嗎? – Jim 2012-07-12 00:29:31

+0

如何配置記錄器將使用我實現的類? – Tomer 2017-05-09 12:22:48

0

我用這一個

public class MyRoller extends RollingFileAppender { 

@Override 
public void rollover() { 
    super.rollover(); 

    final LoggingEvent event = new LoggingEvent(); 
    event.setMessage("CSV_HEADER;1;2;3;4;..."); 
    event.setLevel(Level.INFO); 

    append(event); 
} 

}

相關問題