log日志拦截
2024-10-20 01:35:00
简介
主要记录一下项目中的日志拦截和异常拦截,由于之前公司项目为单体项目,所使用的日志拦截较为简单,只是用拦截器进行前后对日志的拦截,异常拦截直接使用@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}
最新文章
- Mysql数据库表关于几个int类型的字符长度
- javaWeb 数据库连接池连接数据库
- C#设计模式(10)——组合模式(Composite Pattern)
- 8.Smack类库
- 使用定时器实现JavaScript的延期执行或重复执行
- Tomcat下server.xml中context介绍
- poj1556
- 读书笔记之深入分析Java Web技术内幕
- Java常见内存溢出异常分析(OutOfMemoryError)
- 《生活在Linux中》之:prefer function to alias in Bash
- 使用JavaCV/OpenCV抓取并存储摄像头图像
- 使用sed删除拼音的音调
- CDN的简单理解
- Jquery密码强度校验
- Java_图片切片
- 一键脚本清理DEBIAN系统无用组件 减少系统资源
- AndroidNDK开发中使用CMake编译JNI
- [转帖]你所不知道的C和C++运行库
- 09、 在QQ音乐中查找七里香这首歌的精彩评论
- mysql两条sql合并查询总数
热门文章
- siblings() 获得匹配集合中每个元素的同胞
- Java中的元注解
- Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)
- 高可用之nginx配置文件详解
- jmeter登录配置
- 安装node-sass时出现的错误解决方案(Mac自用,也可以借鉴)
- P1046 阶乘
- Jasypt加密SpringBoot配置文件
- HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
- easyUI demo2