如果 FileAppender 失败,则恢复到 ConsoleAppender

发布于 2024-08-07 06:38:04 字数 1884 浏览 1 评论 0原文

使用 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>

With log4j, I'd like to revert to a ConsoleAppender if the FileAppender has problems writing to the specified log file. This means catching a FileNotFoundException or an IOException and switching to a ConsoleAppender.

Has this been done before or will I have to create a new appender - something along the lines of:

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);
    }
}

UPDATE - HOW I DID IT:

Thanks to @jsight, for pointing me to FallBackErrorHandler.

Here is my log4j xml configuration which reverts to a ConsoleAppender, if FileAppender fails:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

攒一口袋星星 2024-08-14 06:38:04

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

来自log4j 常见问题解答

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

通过故障停止,我们的意思是 log4j 不会在运行时引发可能导致应用程序崩溃的意外异常。如果出于任何原因,log4j 引发未捕获的异常,请发送电子邮件至 [email protected ] 邮件列表。未捕获的异常将被视为需要立即关注的严重错误。

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

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

You would have to create a new/custom appender, as log4j will never throw an Exception to your code if there is a problem logging to an appender. This is a design goal and feature of log4j.

From the log4j FAQ:

Is log4j a reliable logging system?
No. log4j is not reliable. It is a best-effort fail-stop logging system.

By fail-stop, we mean that log4j will not throw unexpected exceptions at run-time potentially causing your application to crash. If for any reason, log4j throws an uncaught exception, please send an email to the [email protected] mailing list. Uncaught exceptions are handled as serious bugs requiring immediate attention.

Moreover, log4j will not revert to System.out or System.err when its designated output stream is not opened, is not writable or becomes full. This avoids corrupting an otherwise working program by flooding the user's terminal because logging fails. However, log4j will output a single message to System.err indicating that logging can not be performed.

What are the features of log4j?
...
log4j is fail-stop. However, altough it certainly strives to ensure delivery, log4j does not guarantee that each log statement will be delivered to its destination.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文