2009-10-01 72 views
3

使用log4j,如果FileAppender在寫入指定日誌文件時遇到問題,我想恢復爲ConsoleAppender。這意味着捕獲FileNotFoundException或IOException並切換到ConsoleAppender。如果FileAppender失敗,恢復到ConsoleAppender

一直這樣做過的事情,否則我將不得不創建一個新的appender - 東西線沿線的:

private WriterAppender appender; 

public FileOrConsoleAppender(Layout layout, String filename, boolean append) { 
    try { 
     appender = new FileAppender(layout, filename, append, bufferedIO, bufferSize); 
    } 
    catch (IOException e) { 
     appender = new ConsoleAppender(layout); 
    } 
} 

更新 - 我怎麼沒IT:

感謝@jsight,指向我FallBackErrorHandler。

這裏是我的log4j xml配置其恢復到一個是ConsoleAppender,如果FileAppender失敗:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> 

    <!-- A Console appender --> 
    <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/> 
    </layout> 
    </appender> 

    <!-- A File appender, with fallback to Console--> 
    <appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> 
    <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler"> 
     <root-ref/> 
     <appender-ref ref="console"/> 
    </errorHandler> 
    <param name="File" value="C:/temp/test.log"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/> 
    </layout> 
    </appender> 

<root> 
     <level value="INFO" /> 
     <appender-ref ref="file" /> 
</root> 

</log4j:configuration> 

回答

1

你將不得不創建一個新的/自定義的appender,因爲log4j的絕不會拋出異常的代碼,如果有是記錄到appender的問題。這是log4j的設計目標和功能。

the log4j FAQ

log4j的是一個可靠的日誌系統?
編號log4j不可靠。這是一個盡力而爲的故障停止記錄系統。

通過fail-stop,我們的意思是log4j不會在運行時拋出意外的異常,從而可能導致應用程序崩潰。如果出於任何原因,log4j會拋出未捕獲的異常,請發送電子郵件至[email protected]郵件列表。未捕獲的異常被視爲需要立即關注的嚴重錯誤。

此外,log4j在其指定的輸出流未打開,不可寫或未滿時不會恢復爲System.out或System.err。這避免了由於記錄失敗而導致用戶的終端氾濫,從而破壞了另外的工作程序。但是,log4j會向System.err輸出一條消息,指示無法執行日誌記錄。

log4j有哪些功能?
...
log4j是故障停止。但是,儘管它確實努力確保交付,但log4j並不保證每個日誌語句都將交付到其目的地。