Если FileAppender не работает, вернитесь в ConsoleAppender

С log4j я хотел бы вернуться к ConsoleAppender, если у FileAppender есть проблемы с записью в указанный файл журнала. Это означает перехват FileNotFoundException или IOException и переключение на ConsoleAppender.

Было ли это сделано раньше, или мне придется создать новый аппендер - что-то вроде:

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.

Вот моя конфигурация 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>

person dogbane    schedule 01.10.2009    source источник


Ответы (2)


FallbackErrorHandler выглядит как то, что вам нужно. Вот несколько сообщений по этой теме в списках рассылки:

person jsight    schedule 01.10.2009

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

Из FAQ по log4j:

Является ли log4j надежной системой регистрации?
Нет. log4j ненадежен. Это оптимальная система регистрации отказов.

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

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

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

person matt b    schedule 01.10.2009