如果 FileAppender 失败,则恢复到 ConsoleAppender
使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
FallbackErrorHandler 看起来像您需要的。以下是有关该主题的一些邮件列表帖子:
FallbackErrorHandler looks like what you need. Here are a few mailing list postings on the subject:
您必须创建一个新的/自定义的附加程序,因为如果日志附加程序出现问题,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: