首页 > 其他分享 >AOP打印日志参数和耗时

AOP打印日志参数和耗时

时间:2023-11-16 22:34:55浏览次数:30  
标签:打印 demo args 耗时 controller AOP 日志 example

使用场景:

可以通过 AOP , 以 控制层 controller 所在的包为切点, 在 controller 的方法前后打印日志,这样就能统计出接口的耗时,还能打印入参,出参,减少重复地打印日志。

如果想统计 dao 层的入参和耗时,也可以用类似的方法。

代码示例:

@Aspect
@Component
public class RequestLogAop {


    /**
     * 定义切点 切点为 com.example.demo..controller 下所有的类
     *
     * 第一个 controller.* 表示命名为controller的包下的任意类,
     * 第二个 * 表示任意方法。
     * .. 表示匹配任意数量任意类型的参数。
     */
    @Pointcut("execution(* com.example.demo..controller.*.*(..))")
    public void pointcut() {
    }

    /**
     * 环绕通知。在方法的前后打印日志。
     */
    @Around(value = "pointcut()")
    public Object webLogAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // 类名称示例:com.example.demo.controller.OrderTestController
        String className = joinPoint.getTarget().getClass().getName();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 方法名称示例:com.example.demo.controller.OrderTestController#get
        // 可以选中方法后,根据idea快捷键 ctrl+alt+shift+c,复制方法,然后搜索日志。反之亦可。
        String methodName = className + "#" + signature.getMethod().getName();
        long start = System.currentTimeMillis();
        //过滤无法序列化的参数类型
        Object[] objects = filterArgs(joinPoint.getArgs());
        //在方法执行前,打印日志
        log.info("class method: {} , parameter:{}.", methodName, JSON.toJSONString(objects));
        Object proceed = joinPoint.proceed();
        //在方法执行后,打印日志
        //如果还需要打印接口的返回值,就打印 JSON.toJSONString(proceed)
        log.info("class method: {} , takes time: {}ms.",
                methodName, (System.currentTimeMillis() - start));
        return proceed;
    }

    /**
     * 过滤无法序列化的参数类型
     *
     * @param args
     * @return
     */
    private Object[] filterArgs(Object[] args) {
        Object[] results = new Object[args.length];
        for (int i = 0; i < args.length; i++) {
            if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) {
                //ServletRequest不能序列化,从入参里排除,否则报异常
                continue;
            }
            results[i] = args[i];
        }
        return results;
    }

}

显示日志:

[INFO ] 2023-11-14 23:41:36 c.example.demo.config.RequestLogAop 43: class method: com.example.demo.controller.OrderTestController#get , parameter:[{"id":1,"orderId":"svsvsdvsvwev","userId":1234}]. 

[INFO ] 2023-11-14 23:41:36 c.example.demo.config.RequestLogAop 46: class method: com.example.demo.controller.OrderTestController#get , takes time: 161ms. 

方法名称示例:com.example.demo.controller.OrderTestController#get

如果想根据代码搜索日志,那么可以选中方法后,根据idea的快捷键 ctrl+alt+shift+c,复制方法,然后搜索日志。

如果想根据日志搜索代码,那么复制日志打印出来的类和方法,然后可以用idea的快捷键 双shift ,快速搜索方法.

标签:打印,demo,args,耗时,controller,AOP,日志,example
From: https://www.cnblogs.com/expiator/p/17837433.html

相关文章

  • 常见的日志框架及Logback日志框架的使用
    什么是日志日志是一种记录系统运行时信息的方式,这些信息可以包括程序的状态、错误消息、警告、调试信息等日志的作用1.调试和故障排除当代码出现Bug时,可以通过查看日志,了解程序正在执行过程中的各个步骤和状态,可快速定位和修复问题。2.监控和性能分析用于监控应用程序的运......
  • 【grep】linux 下日志查看的筛选技巧
    查看关键字前后20个字符grep-oP'.{0,20}deviceName.{0,20}'data.loggrep-oE'.{0,20}deviceName.{0,20}'data.log(在macos下,不认识-P参数)只显示一行日志的第1~20个字符moredata.log|cut-c1-20......
  • Log4Delphi日志学习
    转载请注明出处:https://www.cnblogs.com/coder163/p/9309717.htmlhttps://log4delphi.sourceforge.net/tutorial.htmlLog4D下载:官网地址导入Delphi:Tool-->Options-->EnvironmentOptions--->DelphiOptions--Library-->Librarypath 三个目录使用载入配置文件菜单--->P......
  • 修改/etc/docker/daemon.json中的log-opts配置发现无效 docker 限制日志大小
    https://colobu.com/2018/10/22/no-space-left-on-device-for-docker/在/etc/docker/daemon.json中修改或添加log-opts参数"log-driver":"json-file","log-opts":{"max-size":"50m","max-file":"3"}网上很......
  • nginx 日志备份
    ·1、编辑脚本backup.sh#!/bin/bash#进入备份目录cd/data/nginx/logs/#设置备份名字newAccessLog="access`date+%Y-%m-%d`.log"newErrorLog="error`date+%Y-%m-%d`.log"#拷贝日志文件,已经在配置文件设置日志文件存放在:/data/nginx/logs/下,如果没有修改日志路径的一般在:/u......
  • nginx 日志查询
    转载:https://www.jianshu.com/p/f105fb19dd0b1、根据访问IP统计UVawk'{print$1}'access.log|sort|uniq-c|wc-l2、统计访问URL统计PVawk'{print$7}'access.log|wc-l3、查询访问最频繁的URLawk'{print$7}'access.log|sort|uniq-c|sort-n-k1-r|m......
  • goldengate add trandata显示最小附加日志already enable,但是info trandata显示disabl
    问题描述:数据库版本11.2.0.4,操作系统版本:windowsserver2012,goldengate版本12.1.2.1.0在给ogg同步表添加trandata的时候,提示supplementalredologdataisalreadyenabled。但是使用infotrandata查看的时候,却显示supplementalredologdataisdisabled。  这时通过......
  • RMAN-ERROR:因为找不到过期和丢失的归档日志而备份失败
    oracleRMANERRORoracle采用rman备份,但是备份过程中报错如下:RMAN-00571:===========================================================RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS===============RMAN-00571:========================================......
  • elk分布式日志系统2
    《接着上篇文章elk分布式日志系统1,继续学习》 【Filebeat+Logstash+es】  --------------------------filter不做任何处理,直接输出到logstash----------------------------  1,输出日志到logstash 编辑配置文件filebeat.yml,  关闭output.elasticsearch配置   2,编......
  • .NET 过滤器、中间件、AOP、拦截器及其应用
    一、过滤器(Filter)    一共5种、 AuthorizationFilter,ResourceFilter,ExceptionFilter,ActionFilter,ResultFilter    1.1、ExceptionFilter        新增全局异常过滤器GlobalExceptionFilter.cs。        当出现异常时进......