2010-04-27 84 views
10

我們有一個模塊化應用程序,其中模塊具有自己的log4j日誌(即通信日誌和錯誤日誌)。這些appender和類別都在覈心log4j XML中配置,但並非所有模塊都始終安裝。 DailyRollingFileAppender創建其文件,不管使用情況如何,並且公開了整套模塊,儘管不存在,並且由於其中一些模塊是特定客戶,我們希望隱藏未使用的日誌。 有沒有辦法使DailyRollingFileAppender首次使用而不是自動啓動時創建它的文件?如何讓log4j只根據需要創建日誌文件?

+0

爲什麼不在覈心XML中排除禁用組件的塊? – newtover 2010-04-27 09:41:42

+0

我們正在部署log4j配置oonce,然後可以添加模塊。在我們將log4j的詳細信息打開以進行本地更改時,我們很難在以後的安裝中修改該文件。 是的,我們需要高水平的安裝自動化。 – Mirvnillith 2010-04-29 08:26:42

回答

4

文件追加程序別無選擇,懶洋洋地創建日誌文件 - 如果不已經setFile方法會自動創建該文件存在:ostream = new FileOutputStream(fileName, append);

你將不得不延長的appender和覆蓋該文件初始化編寫自己的代碼來獲得你所追求的行爲。

+0

我很欣賞這個答案有點晚,但是我最近一直在和Log4j進行太多的爭鬥,不願意留下懸念:-) – Andy 2010-11-08 15:38:43

+0

我只需要咬那個子彈然後...... – Mirvnillith 2010-11-15 13:49:01

6

我有同樣的問題,所以我擴展了標準的FileAppender類,並且創建了一個新的LazyFileAppender,這是一個FileAppender,它懶散地初始化日誌文件(僅當第一次寫入操作發生時才創建它)。

LazyFileAppender和標準log4j庫的一些其他附加功能可以在我創建的簡單庫中找到:log4j-additions

你可以看一下源開發自己的擴展,或者您可以使用它作爲是...

0

擴展標準FileAppender類是不成功我。所以我發現了另一個解決方案,它使用appender以編程方式創建日誌文件(僅在名稱文件中使用時間戳)。我寫了這兩種方法:

public void startLog() { 
    SimpleDateFormat sdf_long = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
    FileAppender fa = new FileAppender(); 
    fa.setName("foo"); 
    fa.setFile(sdf_long.format(new Date()) + ".log"); 
    fa.setLayout(new PatternLayout("%d{HH:mm:ss.SSS} %m%n")); 
    fa.setThreshold(Level.DEBUG); 
    fa.setAppend(true); 
    fa.activateOptions(); 
    Logger.getRootLogger().addAppender(fa); 
} 

public void stopLog() { 
    Logger.getRootLogger().getAppender("foo").close(); 
    Logger.getRootLogger().removeAppender("foo"); 
} 

我的log4j.properties文件只配置控制檯appender。當我想開始記錄時,我調用startLog()方法。當我想登錄其他文件時,我先調用stopLog(),然後再調用startLog()方法。