SpringBoot记录访问日志应该写在哪里呢?

问题描述

使用@Around记录日志,发现异常无法被全局异常@ControllerAdvice捕获了

问题出现的环境背景及自己尝试过哪些方法

SpringBoot项目,由于全局异常无法捕获,所以目前的解决方案是在@Around异常捕捉后再抛出一个异常,此时就可以被全局异常类捕获了,但是觉得这样做不太好。

相关代码

@Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
        Object result = null;
        long execute;
        try {
            startTime.set(System.currentTimeMillis());
            result = point.proceed();
            // 保存请求日志
            execute = System.currentTimeMillis() - startTime.get();
            saveRequestLog(request, execute);
        } catch (Exception e) {
            saveExceptionLog(request, e.getMessage());
            // AOP无法被全局异常捕获,重新抛出异常可被捕获
            throw new RuntimeException(e.getMessage(),e.getCause());
        } catch (Throwable throwable) {
            saveExceptionLog(request, throwable.getMessage());
            throw new RuntimeException(throwable.getMessage(),throwable.getCause());
        }
        return result;
    }

你期待的结果是什么?实际看到的错误信息又是什么?

过滤器Filter,Intercepter、自定义AOP都可以记日志,但这些日志有何区别,实际开发中,到底应该把记录日志的逻辑放到那里呢?

想看看大家记录访问日志都放在哪里,帮我排一排坑。谢谢

阅读 1.5k
1 个回答

访问日志建议写到 路由拦截器里面,为什么?因为spring的mvc拦截器,帮你获取到了request参数
当然你要自己写aop切面拦截每个controller方法行不行,其实也行,没什么特别的毛病,在aop切面里面你能记录的东西可能还更多一些,根据自己的需求去做就好了,记录到哪里都是根据需求去的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题