Logback中fatal方法替代方案及两段错误处理代码的差异
Logback中fatal级日志的替代方案及两段异常处理代码的差异
我来帮你理清楚这两个问题:
一、logback.fatal("foo")的简单替代方案
其实Logback原生的Logger接口并没有提供fatal()方法,它的日志级别体系是 TRACE < DEBUG < INFO < WARN < ERROR。如果需要打类似"致命"级别的日志,有两个简单的替代方式:
- 直接用
log.error(),在日志消息里明确标注是致命错误,比如log.error("[FATAL] foo")。之后你可以通过Logback的配置文件(比如logback.xml),把ERROR级别的日志输出到专门的文件或者做特殊标记,这样就能和普通ERROR日志区分开。 - 如果你非要单独加FATAL级别,也可以扩展Logback的级别定义,但这个操作比较繁琐,一般日常开发用第一种方法完全够用,没必要折腾。
二、两段异常处理代码的核心差异
先把两段代码摆出来对比:
第一段代码:
try { ... } catch(Exception e) { logback.error("fatal error!"); System.exit(-1); }
第二段代码(假设logback.fatal()是可用的致命级日志方法):
try { ... } catch(Exception e) { logback.fatal("fatal error!"); }
除了日志级别标记的区别外,最关键的差异是这两点:
进程是否直接终止
第一段代码在打完错误日志后,调用了System.exit(-1)——这行代码会立刻终止当前Java进程,所有线程都会停止,JVM直接退出,程序不会再执行catch块之后的任何代码。
第二段代码只是打印了一条致命级别的日志,日志打印完成后,程序会继续执行catch块之后的逻辑,进程会正常运行下去。额外小提醒
顺便说一句,这两段代码都没把异常对象e传入日志方法,这其实是个小问题。正确的做法应该是log.error("fatal error!", e)或者log.fatal("fatal error!", e),这样日志会打印出异常的堆栈信息,方便你后续排查问题。不过这是优化点,不是两段代码本身的差异。
总结一下:第一段是记录错误后直接杀进程,第二段是只记致命日志但程序继续跑——这就是最本质的区别。
内容的提问来源于stack exchange,提问作者feybas
相关产品推荐
相关产品推荐

