Если FileAppender не удается, вернитесь к ConsoleAppender - PullRequest
3 голосов
/ 01 октября 2009

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

ОБНОВЛЕНИЕ - КАК Я ЭТО СДЕЛАЛ:

Спасибо @jsight за указание на FallBackErrorHandler.

Вот моя xml-конфигурация log4j, которая в случае сбоя FileAppender возвращается к ConsoleAppender:

<?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>

Ответы [ 2 ]

4 голосов
/ 01 октября 2009
1 голос
/ 01 октября 2009

Вам нужно будет создать новый / пользовательский аппендир, так как log4j никогда не сгенерирует исключение в вашем коде, если возникнет проблема с регистрацией аппендера. Это цель дизайна и особенность log4j.

С FAQ по log4j :

Является ли log4j надежной системой регистрации?
Нет. Log4j не является надежным. Это лучшая система регистрации ошибок.

Под отказоустойчивостью мы подразумеваем, что log4j не будет генерировать непредвиденные исключения во время выполнения, что может привести к сбою приложения. Если по какой-либо причине log4j выдает необработанное исключение, отправьте электронное письмо в список рассылки log4j-user@logging.apache.org. Неизученные исключения обрабатываются как серьезные ошибки, требующие немедленного внимания.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...