简介

主要记录一下项目中的日志拦截和异常拦截,由于之前公司项目为单体项目,所使用的日志拦截较为简单,只是用拦截器进行前后对日志的拦截,异常拦截直接使用@ExceptionHandler,而现在公司接口使用的dubbo协议通信,一个网关将http协议转为dubbo协议调用,属于分布式项目,日志记录我觉得有点意思,是我之前所没有想到的。

主要流程

前提是公司所有的请求参数都封装到一个对象中,然后该类继承自一个DefaultRequest类,该类中有统一的封装参数,如requestId等等。
首先请求到了网关,网关分派一个唯一requestId存储到请求对象中,然后转发到对应的服务中,如果对应的服务继续调用其他的服务则继续将该requestId传递下去,这样通过requestId就可以找到所有的相关日志了。
而在日志的拦截上使用的是aop环绕通知拦截的,顺带把异常信息也拦截了,但是大家注意只要拦截接口层,不要拦截业务层,否则声明式事务将会失效

aop代码

这里我就不贴公司代码了,我自己模拟一下

 1@Component
2@Aspect
3@Slf4j
4public class LogAop {
5
6    @Pointcut("execution(public * com.xiaoguo.web.controller.*.*(..))")
7    public void point() {
8    }
9
10
11    @Around("point()")
12    public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
13        long startTime = System.currentTimeMillis();
14        //对参数进行分析
15        Object firstArg = proceedingJoinPoint.getArgs()[0];
16        String requestId = "test";
17        if (firstArg instanceof DefaultRequest) {
18            requestId = ((DefaultRequest) firstArg).getRequestId();
19        }
20        log.info("{}请求开始: {}", requestId, startTime);
21        Object obj = null;
22        try {
23            obj = proceedingJoinPoint.proceed();
24        }
25        //自定义异常拦截(这里用 RuntimeException 暂时代替一下明白意思就行)
26        catch (RuntimeException r) {
27            long endTime = System.currentTimeMillis();
28            log.info("{}xxx{}: {}", requestId, r.getMessage(), endTime - startTime, r);
29            return r.getMessage();
30        }
31        //未知异常拦截
32        catch (Exception e) {
33            long endTime = System.currentTimeMillis();
34            log.info("{}异常结束: {}", requestId, endTime - startTime, e);
35            return "fail";
36        }
37        long endTime = System.currentTimeMillis();
38        log.info("{}请求结束: {}", requestId, endTime - startTime);
39        return obj;
40    }
41
42    @Data
43    class DefaultRequest {
44        private String requestId;
45    }
46
47}

最新文章

  1. Mysql数据库表关于几个int类型的字符长度
  2. javaWeb 数据库连接池连接数据库
  3. C#设计模式(10)——组合模式(Composite Pattern)
  4. 8.Smack类库
  5. 使用定时器实现JavaScript的延期执行或重复执行
  6. Tomcat下server.xml中context介绍
  7. poj1556
  8. 读书笔记之深入分析Java Web技术内幕
  9. Java常见内存溢出异常分析(OutOfMemoryError)
  10. 《生活在Linux中》之:prefer function to alias in Bash
  11. 使用JavaCV/OpenCV抓取并存储摄像头图像
  12. 使用sed删除拼音的音调
  13. CDN的简单理解
  14. Jquery密码强度校验
  15. Java_图片切片
  16. 一键脚本清理DEBIAN系统无用组件 减少系统资源
  17. AndroidNDK开发中使用CMake编译JNI
  18. [转帖]你所不知道的C和C++运行库
  19. 09、 在QQ音乐中查找七里香这首歌的精彩评论
  20. mysql两条sql合并查询总数

热门文章

  1. siblings() 获得匹配集合中每个元素的同胞
  2. Java中的元注解
  3. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)
  4. 高可用之nginx配置文件详解
  5. jmeter登录配置
  6. 安装node-sass时出现的错误解决方案(Mac自用,也可以借鉴)
  7. P1046 阶乘
  8. Jasypt加密SpringBoot配置文件
  9. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
  10. easyUI demo2