【问题标题】:SLF4J-LOG4J How to save in the log file also the uncaught exceptionsSLF4J-LOG4J 如何在日志文件中保存未捕获的异常
【发布时间】:2017-04-26 15:48:45
【问题描述】:


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

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

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

【问题讨论】:

  • Thread 类有一个注册未捕获异常处理程序的方法。

标签: java logging log4j slf4j runtimeexception


【解决方案1】:

如果您想记录未检查异常,请捕获 RuntimeException 并记录它们。
要记录所有异常,请捕获 Exception 并记录它们。
要同时记录错误,请捕获 Throwable 并记录它们。

对于命令行程序,您可能希望在main() 方法中执行此操作,在一个try 块中初始化日志框架之后开始。

如果您使用线程,则需要在 Runnable / Threadrun() 方法中执行此操作。

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

【讨论】:

  • 您好,感谢您的回答,应该可以了。顺便说一句,我想如果有更好的方法来管理它,这似乎有点解决方法。我会等着看是否有人有更好的主意,然后最终将您标记为选择的答案
【解决方案2】:

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

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

查看post了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2014-07-03
    相关资源
    最近更新 更多