Java 禁用log4j2异常(apache';s异常)

Java 禁用log4j2异常(apache';s异常),java,exception,exception-handling,log4j,log4j2,Java,Exception,Exception Handling,Log4j,Log4j2,事实证明,log4j2有时可能不安全。记录消息可能引发异常,从而破坏功能。我认为这不是期望的日志行为-日志记录应该失败而不会破坏功能。以下是一个基本示例: InstrumentedAppender = new InstrumentedAppender (..); appender.start(); ... appender.stop(); final Logger logger = LogManager.getLogger("LOG4J_TEST"); try { logger.error(

事实证明,log4j2有时可能不安全。记录消息可能引发异常,从而破坏功能。我认为这不是期望的日志行为-日志记录应该失败而不会破坏功能。以下是一个基本示例:

InstrumentedAppender = new InstrumentedAppender (..);
appender.start();
...
appender.stop();
final Logger logger = LogManager.getLogger("LOG4J_TEST");
try {
  logger.error("TEST_ERROR");
} catch (Exception e){
  System.out.println("-------------- Exception is thrown");
  e.printStackTrace()
}
在我的输出中,我得到:

org.apache.logging.log4j.core.appender.AppenderLoggingException: Attempted to append to non-started appender org.apache.logging.log4j.core.Appender
        at org.apache.logging.log4j.core.config.AppenderControl.handleError(AppenderControl.java:142)
        at org.apache.logging.log4j.core.config.AppenderControl.ensureAppenderStarted(AppenderControl.java:135)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:127)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
        at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448)
        at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:433)
        at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
...........

在我的应用程序中是否有任何方法可以避免这种日志行为

这可以通过附加器上的ignoreExceptions标志进行设置:

默认值为true,导致在内部记录并忽略附加事件时遇到异常。当设置为false时,异常将传播到调用方。在FailoverAppender中包装此Appender时,必须将其设置为false


FailoverAppender在log4j2中似乎有bug,但仍未解决。此外,我想问的是,我如何才能只删除他们的例外,而不删除我的例外。我需要查看我的异常,但我不想让它们破坏一切……如果我理解正确,您正在实现Appender接口,该接口有一个ignoreException()方法。如果希望忽略内部异常,则需要在该方法中返回false。实际上,我使用的是InstrumentedAppender,它是log4j实现,只是编辑了post…如果引用此类,则可以在构造函数中设置ignoreExceptions标志