如何使用TinyLog记录运行时异常?
TinyLog记录未捕获运行时异常的解决方案
TinyLog默认不会自动捕获线程抛出的未捕获异常,可通过以下三种方式实现运行时异常的日志记录:
方案1:主动捕获异常并传入日志接口
最通用的实现方式,直接将异常对象传入TinyLog的日志方法即可自动打印完整堆栈信息,示例代码:
try { int a = 0; int b = 10; int c = b / a; } catch (ArithmeticException e) { // 异常对象作为第二个参数传入,不要仅传入e.getMessage(),否则只会打印错误描述 org.tinylog.Logger.error(e, "算术运算异常"); }
注意:不要单独将异常的getMessage()返回值作为日志内容传入,否则会丢失堆栈追踪信息
方案2:配置全局未捕获异常处理器
无需在业务代码中逐个写try-catch,给所有线程配置默认未捕获异常处理器即可自动记录所有未捕获的运行时异常:
// 配置全局未捕获异常处理器 Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { org.tinylog.Logger.error(throwable, "线程 {} 发生未捕获异常", thread.getName()); }); // 后续业务代码无需包裹try-catch,抛出的未捕获异常会被自动记录 int a = 0; int b = 10; int c = b / a;
方案3:检查TinyLog配置规则(异常不显示时排查用)
如果已经传入异常对象但日志中没有堆栈信息,可检查tinylog.properties配置,确保异常输出规则未被禁用:
# 日志格式中需包含{exception}占位符才会输出异常堆栈 writer.format = {date:yyyy-MM-dd HH:mm:ss} [{thread}] {level}: {message} {exception} # 可配置堆栈输出的最大行数,不配置默认无限制 writer.exception.stacktrace.limit = 100
内容的提问来源于stack exchange,提问作者Akash Kansal
相关产品推荐
相关产品推荐

