Log4j:使用Properties配置FallbackErrorHandler

时间:2010-06-16 08:23:12

标签: java error-handling log4j

我在我的项目中使用log4j,并希望将FallbackErrorHandler用于备份原因。因此,当我想实现FallbackErrorHandler时,您必须使用DOMConfigurator和XML配置文件。

但是现在,我的客户并不喜欢XML并且寻找方法,他可以自己配置Logging-behavior,我有了在java-properties的帮助下加载基本配置并实例化更高Appender的想法或带有Java代码的ErrorHandler,我可以使用参数进行配置。

到目前为止,ErrorHandler的配置工作正常,log4j-debug显示每个方面都是正确的,但我遇到了一个问题,直到现在还无法解决。我的FallbackErrorHandler开始记录到已经在程序开始的backupAppender ,而不是在标准appender失败时。我无法弄清楚我做错了什么,我可以发布属性的代码和java代码,如果有人想看看它,但首先,我想问,是否有人遇到了同样的问题或者有在Java中配置log4j的经验吗?

1 个答案:

答案 0 :(得分:1)

经过数周的努力,我现在终于找到了解决方案。关键事件是发现,PropertyConfigurator也有一个ErrorHandler类,尽管Geki写道,没有可能使用PropertyConfigurator配置ErrorHandler。所以我继续尝试。

现在我可以简单地将log4j.properties中的基本声明与JavaCode中的Logger,Appender和ErrorHandler的链接相结合。 所以关注我的房产:

log4j.appender.ServerAppender=org.apache.log4j.FileAppender
log4j.appender.ServerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerAppender.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %F - %m%n 
log4j.appender.ServerAppender.file=logs/ServerLog.txt
log4j.appender.ServerAppender.threshold=DEBUG

log4j.logger.com.foo.server=TRACE, ServerAppender

log4j.appender.ServerAppender.errorhandler=org.apache.log4j.varia.FallbackErrorHandler
log4j.appender.ServerAppender.errorhandler.logger-ref=com.foo.server
log4j.appender.ServerAppender.errorhandler.appender-ref=FallbackServerAppender

log4j.appender.FallbackServerAppender=org.apache.log4j.FileAppender
log4j.appender.FallbackServerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.FallbackServerAppender.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %F - %m%n 
log4j.appender.FallbackServerAppender.file=C:/Temp/Test/fallbackServerLog.txt

log4j.logger.com.foo.error=DEBUG,FallbackServerAppender

虽然com.foo.server是我的包层次结构的一部分,但com.foo.error只是一个占位符,所以我可以在Java-Code中调用它。那将是这样的。

PropertyConfigurator.configure(LOG4JCONFIG);
FallbackErrorHandler fbeh=(FallbackErrorHandler)LogManager.getLogger("com.foo.server").getAppender("ServerAppender").getErrorHandler();
fbeh.setLogger(LogManager.getLogger("com.foo.server"));
fbeh.setAppender(LogManager.getLogger("com.foo.server").getAppender("ServerAppender"));         
fbeh.setBackupAppender(LogManager.getLogger("com.foo.error").getAppender("FallbackServerAppender"));

一个已知问题,当Appender再次打开时,fallbackErrorHandler没有重置,可以通过在情况中或之后重新启动configure()方法来解决,通常正常的Appender无法登录。

希望它可以帮助某人:)