2012-11-08 22 views
8

我需要的功能是在配置的日誌文件的開頭寫入標題行。此外,日誌文件還應根據時間模式(我正在說logback 1.0.7)根據回滾自定義Logback Appender - 預先添加文件頭並使其滾動

所以,我想編寫一個的Appender的 - 儘管我不知道它是否是不是自定義佈局我實際需要。

1)追加程序

每的logback的文檔,正確的做法是延長AppenderSkeleton,但後來我將如何結合這與RollingFileAppender(使文件翻轉?)

另如果我擴展RollingFileAppender,我會重寫什麼方法來裝飾現有的功能?我如何告訴它只在文件的開頭寫入特定的字符串?

2)佈局

類似地,該方法似乎是延伸LayoutBase,以及用於提供doLayout(ILoggingEvent event)的實現。 但是,我不知道如何修飾行爲 - 只需在文件中添加新行,而不是破壞其功能(因爲我仍然希望其他日誌正常顯示)。

getFileHeader()LayoutBase看起來很有前途,但我該如何使用它?它是否打算被自定義佈局覆蓋? (可能是的,因爲它是佈局界面的一部分,但是如何?)

謝謝!

回答

10

這裏我回答我自己的問題,以防萬一別人遇到同樣的問題。 這就是我最終做到了(不但是知道這是正統的樣子):

延長AppenderSkeleton的相反,我延長RollingFileAppender進行(保持翻轉功能),並推翻其中openFile()方法。在這裏,我可以操作日誌文件並在其中寫入標題,讓它在默認情況下執行所需的任何操作。像這樣:

public void openFile(String fileName) throws IOException { 
     super.openFile(fileName); 
     File activeFile = new File(getFile()); 
     if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) { 
      FileUtils.writeStringToFile(activeFile, header); 
     } 
    } 

我配置在logback.xml頭,像這樣簡單:<header> value </header>。這將它注入到我新的appender的標題欄中。

似乎工作沒有問題,但請發佈,如果你知道更好的方法!

+0

@teo你知道,如何才能在logback.xml在任何自定義的Appender類的啓動方法定義自定義屬性? – Mihir

4

您的解決方案有一個問題:它會刪除每個新文件的第一行日誌。我認爲這是因爲你寫了標題,而文件是通過logback打開的。 我發現另一種解決方案是不存在這個問題:

public void openFile(String fileName) throws IOException 
{ 
    super.openFile(fileName); 
    File activeFile = new File(getFile()); 
    if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) 
    { 
     lock.lock(); 
     try 
     { 
      new PrintWriter(new OutputStreamWriter(getOutputStream(), StandardCharsets.UTF_8), true).println("your header"); 
     } 
     finally 
     { 
      lock.unlock(); 
     } 
    } 
}