springboot+aop切点记录请求和响应信息

本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息;这里主要讲解两种切入点方式,一种方法切入,一种注解切入;首先创建个springboot测试工程并通过maven添加如下依赖:

                    org.springframework.boot            spring-boot-starter-aop                                    com.alibaba            fastjson            1.2.44       

  先来说方法的切点方式,需要创建个名为LogAspect的组件类,然后用@Aspect注解修饰组件类,再通过设置方法切入点方式做公共日志记录,如下创建切入点:

//切点入口 Controller包下面所有类的所有方法privatefinal String pointcut ="execution(* com.platform.Controller..*(..))";

    //切点@Pointcut(value = pointcut)

    publicvoid log() {

    }

  这里的execution( com.platform.Controller..(..))主要的意思是:切入点入口是Controller包下面所有类的所有方法;再来通过@Around环绕注解方法里面做请求参数和响应信息的记录,如下代码:

@Around(value ="log()")

    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        Object result =null;

        StringBuilder sbLog =newStringBuilder("\n");

        try {

            sbLog.append(String.format("类名:%s\r\n", proceedingJoinPoint.getTarget().getClass().getName()));

            MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

            sbLog.append(String.format("方法:%s\r\n", methodSignature.getMethod().getName()));

            Object[] args = proceedingJoinPoint.getArgs();

            for (Object o : args) {

                sbLog.append(String.format("参数:%s\r\n", JSON.toJSON(o)));

            }

            longstartTime = System.currentTimeMillis();

            result = proceedingJoinPoint.proceed();

            longendTime = System.currentTimeMillis();

            sbLog.append(String.format("返回:%s\r\n", JSON.toJSON(result)));

            sbLog.append(String.format("耗时:%ss", endTime - startTime));

        } catch (Exception ex) {

            sbLog.append(String.format("异常:%s", ex.getMessage()));

        } finally {

            logger.info(sbLog.toString());

        }

        return result;

    }

  此刻主要代码就完成了,再来我们配置下日志的记录方式;首先在 resources目录增加名为logback-spring.xml的文件,其配置信息如:

1 2 6 7 8 9101112131415logback16171819WARN20-->2122%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n2324252627${logPathAll}2829${logPathAll}.%d{yyyy-MM-dd}.zip303132%date %level [%thread] %logger{36} [%file : %line] %msg%n33343536373839404142

  然后application.yml的配置信息如:

1logging:2config: classpath:logback-spring.xml3  logback:4    level: info #info ,debug5path: /home/app/data/applogs/weblog6appname: web

  此刻日志和公共的aop记录类都完成了,我们需要创建个测试用例,其代码如:

1@PostMapping("/addUser")2publicResponseEntity addUser(@RequestBody MoStudent moStudent) throws Exception {3        moStudent.setNumber(UUID.randomUUID().toString());4//        throw new Exception("错误了");5returnnewResponseEntity<>(moStudent, HttpStatus.OK);6}

  最后,通过postman模拟post请求,能够得到如下的日志结果:

  上面的方式切入点是所有方法,所有方法都记录日志可能有是不是需求想要的,此时可以通过注解的方式来标记想记录日志的方法;先来创建个日志注解:

1@Target(ElementType.METHOD) 2@Retention(RetentionPolicy.RUNTIME) 3@Documented 4public @interface LogAnnotation { 5/** 6    * 描述 7    * 8    * @return 9*/10String des()default"";11}

  同样再来创建注解的切入点:

1//匹配方法上包含此注解的方法2privatefinal String annotationPointCut ="@annotation(com.platform.Aop.LogAnnotation)";34//注解切点5@Pointcut(value = annotationPointCut)6publicvoid logAnnotation() {7}

  再通过@Around注解绑定具体的操作方法:

1@Around(value ="logAnnotation()") 2public Object aroundAnnotation(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { 3Object result =null; 4StringBuilder sbLog =newStringBuilder("\n"); 5try { 6sbLog.append(String.format("类名:%s\r\n", proceedingJoinPoint.getTarget().getClass().getName())); 7 8MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature(); 9Method method = methodSignature.getMethod();10LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);11if(logAnnotation !=null&& !logAnnotation.des().isEmpty()) {12sbLog.append(String.format("说明:%s\r\n", logAnnotation.des()));13            }14sbLog.append(String.format("方法:%s\r\n", method.getName()));1516Object[] args = proceedingJoinPoint.getArgs();17for (Object o : args) {18sbLog.append(String.format("参数:%s\r\n", JSON.toJSON(o)));19            }2021longstartTime = System.currentTimeMillis();22result = proceedingJoinPoint.proceed();23longendTime = System.currentTimeMillis();24sbLog.append(String.format("返回:%s\r\n", JSON.toJSON(result)));25sbLog.append(String.format("耗时:%ss", endTime - startTime));26}catch (Exception ex) {27sbLog.append(String.format("异常:%s", ex.getMessage()));28}finally {29            logger.info(sbLog.toString());30        }31return result;32}

  这个方法里需要注意的是注解方式相比第一种其实就多了如下几行代码:

1Method method = methodSignature.getMethod();2LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);3if(logAnnotation !=null&& !logAnnotation.des().isEmpty()) {4sbLog.append(String.format("说明:%s\r\n", logAnnotation.des()));5}

  下面是注解测试用例:

1@LogAnnotation(des ="注解记录日志")2@PostMapping("/addUser01")3publicResponseEntity addUser01(@RequestBody MoStudent moStudent) throws Exception {4        moStudent.setNumber(UUID.randomUUID().toString());5returnnewResponseEntity<>(moStudent, HttpStatus.OK);6}

欢迎工作一到五年的Java工程师朋友们加入Java群: 891219277 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 6,562评论 5 24
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,695评论 0 3
  • 如果无法承担在关系中承接的痛,那么逃避也就是一种自我保护。我明白了为什么逃避关系十几年,因为太痛了,选择逃避来...
    晶晶玲玲阅读 127评论 0 0
  • 10月22日 星期日 晴 今天带小姑孑家的孩子去听图书馆看书,刚好赶上人家组织的学习如何下象棋的课程,我就...
    张吕维嘉阅读 146评论 0 0