【问题标题】:If FileAppender fails, revert to ConsoleAppender如果 FileAppender 失败,恢复到 ConsoleAppender
【发布时间】:2009-10-01 16:11:50
【问题描述】:

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

【问题讨论】:

    标签: java log4j


    【解决方案1】:
    【解决方案2】:

    您必须创建一个新的/自定义的附加程序,因为如果记录到附加程序时出现问题,log4j 永远不会向您的代码抛出异常。这是 log4j 的设计目标和特性。

    来自the log4j FAQ

    log4j 是一个可靠的日志系统吗?
    不,log4j 不可靠。这是一个尽力而为的故障停止日志系统。

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

    此外,当指定的输出流未打开、不可写或已满时,log4j 不会恢复为 System.out 或 System.err。这避免了由于日志记录失败而导致用户终端泛滥而破坏其他工作程序。但是,log4j 会向 System.err 输出一条消息,指示无法执行日志记录。

    log4j 有什么特点?
    ...
    log4j 是故障停止。然而,尽管它确实努力确保交付,但 log4j 并不保证每个日志语句都会被交付到其目的地。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2014-05-22
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多