控制台异常堆栈日志写文件
先上问题。使用logback 的朋友会发现一个问题。自己分好日志类型,日志也会按级别输出相应的文件。前提是我们自己调用了info(),error()等日志输出方法。但是这样就存在一个问题就是非jdk检测异常,也就是RunTime异常是无法try..catch 后输出logger.error(e.getMessage())的,每次线上出异常查日志就只有通过容器的控制台日志进行查询,这样就会加大时间成本。并且在每次的try catch都要调error会相当麻烦。
之前是想着把控制台的输出直接写到文件,这个方向不对。因为我们是无法直接切入控制台对象的。直到发现了@ControllerAdvice 这个注解,从名字上可以看出大体意思是控制器增强。内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法。非常简单,不过只有当使用@ExceptionHandler最有用。我们只需要添加一个类作全局异常处理。那么所有的异常都会通过这个方法返回前台,而我们的日志也就可以在这里植入了。
代码如下:
@ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ResponseBody @ExceptionHandler(Exception.class) public Object handleException(Exception e) { logger.error(ExceptionUtils.getFullStackTrace(e)); // 记录错误信息 String msg = e.getMessage(); if (msg == null || msg.equals("")) { msg = "服务器出错"; } JSONObject jsonObject = new JSONObject(); jsonObject.put("message", msg); return jsonObject; } }
下面我们模拟一个runtime异常。通过postMan调用后台方法 1 / 0的操作,
同时我们看看生成的日志文件
时间和pid一一对应,生成日志。这样就可以方便的查看系统异常的堆栈日志了。
(logback日志配置不在这里细说)