Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j:使用属性配置FallbackErrorHandler_Java_Error Handling_Log4j - Fatal编程技术网

Java Log4j:使用属性配置FallbackErrorHandler

Java Log4j:使用属性配置FallbackErrorHandler,java,error-handling,log4j,Java,Error Handling,Log4j,我在项目中使用log4j,出于备份的原因,我想使用FallbackErrorHandler。因此,当我想要实现FallbackErrorHandler时,您必须使用DOMConfigurator,并将其用于XML配置文件 但是现在,我的客户并不真正喜欢XML,他正在寻找一种方法,他可以自己配置日志记录行为,我想到了在java属性的帮助下加载基本配置,并用java代码实例化更高的Appender或ErrorHandler,我可以用参数配置这些代码 到目前为止,ErrorHandler的配置工作正常

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

但是现在,我的客户并不真正喜欢XML,他正在寻找一种方法,他可以自己配置日志记录行为,我想到了在java属性的帮助下加载基本配置,并用java代码实例化更高的Appender或ErrorHandler,我可以用参数配置这些代码


到目前为止,ErrorHandler的配置工作正常,log4j调试显示所有事情都是正确的,但我遇到了一个问题,直到现在我还无法解决。我的FallbackErrorHandler在程序开始时就开始记录到backupAppender,而不是在标准appender失败时。我不知道我做错了什么,如果有人想查看,我可以发布属性代码和java代码,但首先,我想问,是否有人遇到了同样的问题,或者有没有在java中配置log4j的经验?

经过几周的尝试,我终于找到了解决方案。关键事件是发现PropertyConfiguration也有一个ErrorHandler类,尽管Geki写道,不可能用PropertyConfiguration配置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()-方法来解决


希望它能帮助某些人:)

@rdogpink:你应该遵循网站的问答格式,并将解决方案向下移动到适当的答案。这将允许你接受自己的答案。对不起,我想我只是在第一时间监督了按钮,当我写完时,没有。我会纠正它!