简介

主要记录一下项目中的日志拦截和异常拦截,由于之前公司项目为单体项目,所使用的日志拦截较为简单,只是用拦截器进行前后对日志的拦截,异常拦截直接使用@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}

log日志拦截的更多相关文章

  1. struts2-权限拦截器、日志拦截器、execAndWait(进度条)拦截器配置

    1.权限拦截器 package login; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.Serv ...

  2. AOP 切面编程------JoinPoint ---- log日志

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  3. 个人博客开发之blog-api 项目全局日志拦截记录

    前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...

  4. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  5. mysql general log日志

    注:应一直出现http://www.cnblogs.com/hwaggLee/p/6030765.html文章中的问题 故mysql general log日志.查看具体是什么命令导致的. 打开 ge ...

  6. 使用触发器实现记录oracle用户登录失败信息到alert.log日志文件

    前面我们说了用oracle自带的审计功能可以实现记录用户登录失败日志到数据表中(链接:http://www.54ok.cn/6778.html).今天我们来分享一下如何把用户登录失败信息记录到aler ...

  7. Junit测试打印详细的log日志,可以看到sql

    Junit测试打印详细的log日志,可以看到sql 在log4j.xml的日志配置文件中,把日志级别从info级别调整到debug级别: <?xml version="1.0" ...

  8. iOS及时log日志查看工具 (iConsole)

    github下载地址:https://github.com/nicklockwood/iConsole 偶然看到的一个iOS及时log日志查看工具,通过该工具,我们可以在任何想看日志的时候,通过手势呼 ...

  9. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)

    [root@ok 资料库]# svn log 简历 ------------------------------------------------------------------------ r ...

随机推荐

  1. Json --- Jackson工具

    一.Jackson简介 Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson ...

  2. H3C 环路避免机制三:毒性逆转

  3. H3C DHCP中继显示及维护

  4. fetch是什么?写一个fetch请求

    fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法. 参考链接:http ...

  5. 2018-8-10-WPF-修改图片颜色

    title author date CreateTime categories WPF 修改图片颜色 lindexi 2018-08-10 19:16:53 +0800 2018-07-03 15:4 ...

  6. C++动态数组中的C6385, C6386警告

    警告 C6385 从“m”中读取的数据无效: 可读大小为“col*sizeof(int)”个字节,但可能读取了“8”个字节. 警告 C6386 写入到“m”时缓冲区溢出: 可写大小为“col*size ...

  7. web.config修改文件修改上传大小

    老是要修改上传文件大小的限制,先记在这里. <httpRuntime maxRequestLength= "1048576 " //最大长度 executionTimeout ...

  8. Docker Desktop: Error response from daemon: driver failed programming external connectivity on endpoint xxx 问题

    右击任务栏 Docker 图标 `Restart` 或 `Quit Docker Deskto` 后之前正常的 zookeeper 容器不会自动启动 通过命令 docker start zk1 启动报 ...

  9. TCP/IP||UDP广播和多播

    1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...

  10. TCP/IP||ICMP

    1.概述 ICMP为IP组成部分之一,传递差错报文并返回用户进程,在IP数据报内部被传输 类型字段可以有15个不同的值,以描述特定类型的ICMP报文,检验和字段覆盖整个ICMP报文. 2.报文类型 在 ...