如果FileAppender失败,请恢复为ConsoleAppender

时间:2009-10-01 16:11:50

标签: java log4j

使用log4j,如果FileAppender在写入指定的日志文件时遇到问题,我想恢复为ConsoleAppender。这意味着捕获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。

如果FileAppender失败,这是我的log4j xml配置,它会恢复为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 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

您必须创建一个新的/自定义appender,因为如果登录到appender时出现问题,log4j将永远不会向您的代码抛出异常。这是log4j的设计目标和功能。

来自the log4j FAQ

  

log4j是一个可靠的日志记录系统吗?
  没有.log4j不可靠。它是一种尽力而为的故障停止记录系统。

     

通过失败停止,我们的意思是log4j不会在运行时抛出意外的异常,从而可能导致应用程序崩溃。如果由于任何原因,log4j抛出未捕获的异常,请发送电子邮件至log4j-user@logging.apache.org邮件列表。未捕获的异常被视为需要立即关注的严重错误。

     

此外,当log4j的指定输出流未打开,不可写或变满时,log4j将不会还原为System.out或System.err。这样可以避免因为日志记录失败而淹没用户终端而破坏其他工作程序。但是,log4j将向System.err输出单个消息,指示无法执行日志记录。

     

log4j有什么功能?
  ...
  log4j是失败停止。但是,尽管它确实努力确保交付,但log4j并不保证每个日志语句都将被传送到目的地。