SLF4J-LOG4J如何在日志文件中保存未捕获的异常

时间:2016-12-11 18:39:16

标签: java logging log4j slf4j runtimeexception


我在我的java应用程序中使用slf4j / log4j。
我的问题是,现在我只能记录异常堆栈跟踪,在try catch的catch部分调用适当的logger方法,如:

catch (AnException ex) {
    logger.error("An exception occurred", ex); 
}

我想在日志文件中加入我没有放入任何cacth的运行时异常,例如NullPointerException或NumberFormatException。
正如它们在控制台中显示的那样,我想有一种方法可以将此流从控制台重定向到SLF4J记录器。
任何人都知道我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果您要记录未经检查的例外,请抓住RuntimeException并进行记录。
要记录所有例外,请抓住Exception并记录它们 要记录错误,请捕获Throwable并记录它们。

对于命令行程序,您可能希望在<{1}}方法中,在初始化日志记录框架后的main()中执行此操作。

如果您使用主题,则需要使用Runnable / Threadtry方法执行此操作。

在Servlet Web应用程序中,您可以在Filter中执行此操作,并重新抛出异常,以便容器可以正确处理错误。

答案 1 :(得分:0)

我想强调另一个解决方案,它适用于您的应用程序中全局未捕获的异常,而无需每次都用 try/catch 块进行包装。

线程有一个名为 uncaughtExceptionHandler 的字段,每当出现未捕获的异常时都会使用。例如,可以在启动 main 方法中使用方法 Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler) 覆盖此字段一次。每次出现未捕获的异常时,您的自定义 UncaughtExceptionHandler 将用于处理它。

查看此 post 了解更多详情。