java - Log4j:带有属性的配置回退错误处理程序

标签 java error-handling log4j

我在项目中使用 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/

相关文章:

java - Rhino 将两个已编译的脚本合并为一个

java - HTTPURLConnection - 空响应

java - 用于本地 Spring Boot 开发的 Docker-Compose

java - 线程 “main”中的异常java.lang.IllegalStateException : The driver executable is a directory

java - Log4j 在随机时间/使用后停止工作

java - 如何创建 log4j 包装并获取正确的日志

java - 自动管理Java对象

javascript - 无法在纯 js 中处理 net::ERR_CONNECTION_REFUSED

sql-server - 如何在UDF标量函数中将表名作为参数传递?

spring - Gradle 从 Spring 中排除 SLF4J