2009-10-01 3 views
3

С log4j, я хотел бы вернуться к ConsoleAppender, если FileAppender имеет проблемы с записью в указанный файл журнала. Это означает, что вы поймаете 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); 
    } 
} 

UPDATE - как я это сделал:

Благодаря @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 никогда не выбросить исключение в код, если является проблемой регистрации в приложении. Это цель дизайна и особенность log4j.

От the log4j FAQ:

Является log4j надежная система регистрации?
No. log4j не является надежным. Это самая эффективная система регистрации отказов.

Под неудачей мы подразумеваем, что log4j не будет бросать неожиданные исключения во время выполнения, что может привести к сбою приложения. Если по какой-либо причине log4j выбрасывает неперехваченное исключение, отправьте электронное письмо в список рассылки [email protected] Необлученные исключения обрабатываются как серьезные ошибки, требующие немедленного внимания.

Кроме того, log4j не будет возвращаться к System.out или System.err, когда его выделенный выходной поток не открывается, не доступен для записи или не заполняется. Это позволяет избежать искажения другой рабочей программы путем наводнения терминала пользователя, поскольку сбой регистрации. Однако log4j выводит одно сообщение в System.err, указывающее, что ведение журнала не может быть выполнено.

Каковы особенности log4j?
...
log4j является отказоустойчивым. Однако, несмотря на то, что он, безусловно, стремится обеспечить доставку, log4j не гарантирует, что каждый оператор журнала будет доставлен в пункт назначения.

Смежные вопросы