代码之家  ›  专栏  ›  技术社区  ›  dogbane

如果FileAppender失败,请恢复到ConsoleAppender

  •  3
  • dogbane  · 技术社区  · 15 年前

    这是以前做过的还是我必须创建一个新的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 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 回复  |  直到 15 年前
        2
  •  1
  •   matt b    15 年前

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

    the log4j FAQ :


    不,log4j不可靠。这是一个尽力而为的故障停止记录系统。

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

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