我在项目中使用 log4j,并希望使用 FallbackErrorHandler 来实现备份原因。因此,当我想实现 FallbackErrorHandler 时,您必须使用 DOMConfigurator 和 XML 配置文件。
但是现在,我的客户并不真正喜欢 XML,并且正在寻找一种方法,他可以自己配置日志记录行为,我想到了在 java-properties 的帮助下加载基本配置并实例化更高的 Appender或带有 Java 代码的 ErrorHandler,我可以使用参数对其进行配置。
到目前为止,ErrorHandler 的配置有效,log4j-debug 显示一切正确,但我遇到了一个至今无法解决的问题。我的 FallbackErrorHandler 在程序开始时就开始记录 backupAppender,而不是在标准附加程序失败时记录。我不知道我做错了什么,如果有人想看的话,我可以发布属性的代码和java代码,但首先,我想问,是否有人遇到了同样的问题或者有在 Java 中配置 log4j 的经验吗?
最佳答案
经过几周的尝试,我现在终于找到了解决方案。关键事件是发现 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 代码中调用它。看起来像这样。
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不会重置,可以通过在正常Appender无法登录的情况下或之后重新启动configure()方法来解决。
希望它可以帮助别人:)
关于java - Log4j:带有属性的配置回退错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051661/