对于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失败,该配置将恢复为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>发布于 2009-10-01 17:33:30
FallbackErrorHandler看起来就像你所需要的。下面是一些关于这个主题的邮件列表:
发布于 2009-10-01 16:51:17
您必须创建一个新的/自定义的附录,因为如果有问题,log4j将不会向您的代码抛出异常。这是log4j的设计目标和特性。
来自log4j常见问题
是一个可靠的日志记录系统吗? 不是的。log4j不可靠。这是一个尽力而为的故障停止日志记录系统。所谓失败停止,我们的意思是log4j不会在运行时抛出意外的异常,从而可能导致应用程序崩溃。如果出于任何原因,log4j抛出了一个不明确的异常,请发送电子邮件到log4j-user@logging.apache.org邮件列表。未被处理的异常作为需要立即注意的严重错误处理。 此外,当指定的输出流未打开、不可写入或已满时,log4j将不会恢复为System.out或System.err。这避免了由于日志记录失败而淹没用户终端,从而破坏了其他工作程序。但是,log4j将向System.err输出一条消息,指示无法执行日志记录。 log4j?的特点是什么? ..。 log4j是失败-停止.然而,尽管log4j确实努力确保交付,但它并不保证每个日志语句都将被传递到其目的地。
https://stackoverflow.com/questions/1504929
复制相似问题