我在我的项目中使用log4j,并希望将FallbackErrorHandler用于备份原因。因此,当我想实现FallbackErrorHandler时,您必须使用DOMConfigurator和XML配置文件。
但是现在,我的客户并不喜欢XML并且寻找方法,他可以自己配置Logging-behavior,我有了在java-properties的帮助下加载基本配置并实例化更高Appender的想法或带有Java代码的ErrorHandler,我可以使用参数进行配置。
到目前为止,ErrorHandler的配置工作正常,log4j-debug显示每个方面都是正确的,但我遇到了一个问题,直到现在还无法解决。我的FallbackErrorHandler开始记录到已经在程序开始的backupAppender ,而不是在标准appender失败时。我无法弄清楚我做错了什么,我可以发布属性的代码和java代码,如果有人想看看它,但首先,我想问,是否有人遇到了同样的问题或者有在Java中配置log4j的经验吗?
答案 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无法登录。
希望它可以帮助某人:)