首页 > 解决方案 > 禁用 log4j 2 异常(apache 的异常)

问题描述

事实证明,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)
...........

有什么办法可以在我的应用程序中避免这种日志行为?

标签: javaexceptionexception-handlinglog4jlog4j2

解决方案


这可以使用 appender 上的 ignoreExceptions 标志进行设置:

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

https://logging.apache.org/log4j/2.x/manual/appenders.html


推荐阅读