控制台异常堆栈日志写文件

  先上问题。使用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日志配置不在这里细说)



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐