Java Log4j同步我想捕获Log4j:ERROR setFile(null,true)调用失败

Java Log4j同步我想捕获Log4j:ERROR setFile(null,true)调用失败,java,log4j,Java,Log4j,我想将日志信息发送到“审计”文件。我曾考虑过将log4j与专用Appender一起使用: LOGGER_AUDIT.info("Text of audit"); 我想确保它是同步编写的。如果发生异常,例如: og4j:ERROR setFile(null,true) call failed. java.io.FileNotFoundException: D:audit.log (Access denied) ... 我想捕获它并停止执行 应该是这样的: try { LOGGER_AUD

我想将日志信息发送到“审计”文件。我曾考虑过将log4j与专用Appender一起使用:

LOGGER_AUDIT.info("Text of audit");
我想确保它是同步编写的。如果发生异常,例如:

og4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: D:audit.log (Access denied)
...
我想捕获它并停止执行

应该是这样的:

try {
   LOGGER_AUDIT.info("Text of audit");
} catch(LoggerException logExc) {
   // TODO Ops... the logger do not write.
   throw logExc;
}

您可以通过调用以下命令来强制log4j配置处理:

BasicConfigurator.resetConfiguration();
DOMConfigurator.configureAndWatch( log4jConfigPath );
要捕获异常,可以使用ErrorHandler功能。

以下是它的配置方式:

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
  <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler">
       <root-ref/>
       <appender-ref ref="console"/>
  </errorHandler>
  <param name="File" value="C:/temp/test.log"/>
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/>
  </layout>
</appender>


您可以放置自己的ErrorHandler,而不是FallbackErrorHandler。默认情况下,仅使用OnCeErrorHandler。它将异常打印到STDERR

您可以通过调用以下命令来强制log4j配置处理:

BasicConfigurator.resetConfiguration();
DOMConfigurator.configureAndWatch( log4jConfigPath );
要捕获异常,可以使用ErrorHandler功能。

以下是它的配置方式:

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
  <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler">
       <root-ref/>
       <appender-ref ref="console"/>
  </errorHandler>
  <param name="File" value="C:/temp/test.log"/>
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/>
  </layout>
</appender>


您可以放置自己的ErrorHandler,而不是FallbackErrorHandler。默认情况下,仅使用OnCeErrorHandler。它将异常打印到STDERR

你能更具体一点吗?你的意思是什么?在catch块中处理异常?你的英语看起来不错。嗯,我认为“同步”不是你的问题。出现上述消息时会发生什么情况?应用程序崩溃了吗?当然,您可以通过提供有效的可写路径来避免上述错误。Log4j(2)将在第一次日志调用时自动配置自身。你可以在应用程序的一开始就制作一个,然后用try/catch包装它。如果在配置过程中发生任何异常,您应该能够在那里捕获到它(如果有的话)。Matthias:我编辑我的注释以添加一个伪示例:)Fildor:如果记录器失败,我希望应用程序崩溃。嗯,我猜将每个日志调用包装为try/catch将严重影响性能。第二,我不确定是否真的存在“LoggerException”。。。至少我没有意识到。AFAIKlog4j大部分时间在内部处理异常。我只有在记录一些变量(为空)时才有NPE,而且一次都不够谨慎。但这实际上是在输入log4j代码之前抛出的…您能更具体地说一下您的意思是什么-在catch块中处理异常吗?你的英语看起来不错。嗯,我认为“同步”不是你的问题。出现上述消息时会发生什么情况?应用程序崩溃了吗?当然,您可以通过提供有效的可写路径来避免上述错误。Log4j(2)将在第一次日志调用时自动配置自身。你可以在应用程序的一开始就制作一个,然后用try/catch包装它。如果在配置过程中发生任何异常,您应该能够在那里捕获到它(如果有的话)。Matthias:我编辑我的注释以添加一个伪示例:)Fildor:如果记录器失败,我希望应用程序崩溃。嗯,我猜将每个日志调用包装为try/catch将严重影响性能。第二,我不确定是否真的存在“LoggerException”。。。至少我没有意识到。AFAIKlog4j大部分时间在内部处理异常。我只有在记录一些变量(为空)时才有NPE,而且一次都不够谨慎。但这实际上是在输入log4j代码之前抛出的…我的自定义ErrorHandler可以停止执行吗?它是同步的吗?@vakya,是的,它是同步的。顺便说一句:你可以深入研究log4j代码。@vakya,检查FileAppender#activateOptions()方法。它使用配置中提供的errorHandler。请注意,如果只是将异常抛出错误处理程序,它将在DOMConfigulator#parseAppender()方法中被捕获,并且只有InterruptedException或InterruptedIOException会导致线程中断。如果您只是想关闭应用程序,请调用System.exit()我的自定义ErrorHandler,是否可以停止执行?它是同步的吗?@vakya,是的,它是同步的。顺便说一句:你可以深入研究log4j代码。@vakya,检查FileAppender#activateOptions()方法。它使用配置中提供的errorHandler。请注意,如果只是将异常抛出错误处理程序,它将在DOMConfigulator#parseAppender()方法中被捕获,并且只有InterruptedException或InterruptedIOException会导致线程中断。如果您只是想关闭应用程序,请调用System.exit()