文章目录

  • 一、自定义注解
  • 二、切面类
  • 三、应用
一、自定义注解

自定义切面注解@PrintlnLog 用来输出日志,注解权限 @Target({ElementType.METHOD}) 限制只在方法上使用,注解中只有一个参数 description ,用来自定义方法输出日志的描述。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface PrintlnLog {/*** 自定义日志描述信息文案** @return*/String description() default "";
}
二、切面类

接下来编写@PrintlnLog 注解对应的切面实现,doBefore()中输出方法的自定义描述、入参、请求方式、请求url、被调用方法的位置等信息,doAround() 中打印方法返回结果。

注意: 如何想指定切面在哪个环境执行,可以用@Profile 注解,只打印某个环境的日志。

@Slf4j
@Aspect
@Component
//@Profile({"dev"}) //只对某个环境打印日志
public class LogAspect {private static final String LINE_SEPARATOR = System.lineSeparator();/*** 以自定义 @PrintlnLog 注解作为切面入口*/@Pointcut("@annotation(com.chengxy.unifiedlog.config.PrintlnLog)")public void PrintlnLog() {}/*** @param joinPoint* @author fu* @description 切面方法入参日志打印* @date 2020/7/15 10:30*/@Before("PrintlnLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String methodDetailDescription = this.getAspectMethodLogDescJP(joinPoint);log.info("------------------------------- start --------------------------");/*** 打印自定义方法描述*/log.info("Method detail Description: {}", methodDetailDescription);/*** 打印请求入参*/log.info("Request Args: {}", JSON.toJSONString(joinPoint.getArgs()));/*** 打印请求方式*/log.info("Request method: {}", request.getMethod());/*** 打印请求 url*/log.info("Request URL: {}", request.getRequestURL().toString());/*** 打印调用方法全路径以及执行方法*/log.info("Request Class and Method: {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());}/*** @param proceedingJoinPoint* @author xiaofu* @description 切面方法返回结果日志打印* @date 2020/7/15 10:32*/@Around("PrintlnLog()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {String aspectMethodLogDescPJ = getAspectMethodLogDescPJ(proceedingJoinPoint);long startTime = System.currentTimeMillis();Object result = proceedingJoinPoint.proceed();/*** 输出结果*/log.info("{},Response result  : {}", aspectMethodLogDescPJ, JSON.toJSONString(result));/*** 方法执行耗时*/log.info("Time Consuming: {} ms", System.currentTimeMillis() - startTime);return result;}/*** @author xiaofu* @description 切面方法执行后执行* @date 2020/7/15 10:31*/@After("PrintlnLog()")public void doAfter(JoinPoint joinPoint) throws Throwable {log.info("------------------------------- End --------------------------" + LINE_SEPARATOR);}/*** @param joinPoint* @author xiaofu* @description @PrintlnLog 注解作用的切面方法详细细信息* @date 2020/7/15 10:34*/public String getAspectMethodLogDescJP(JoinPoint joinPoint) throws Exception {String targetName = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();Object[] arguments = joinPoint.getArgs();return getAspectMethodLogDesc(targetName, methodName, arguments);}/*** @param proceedingJoinPoint* @author xiaofu* @description @PrintlnLog 注解作用的切面方法详细细信息* @date 2020/7/15 10:34*/public String getAspectMethodLogDescPJ(ProceedingJoinPoint proceedingJoinPoint) throws Exception {String targetName = proceedingJoinPoint.getTarget().getClass().getName();String methodName = proceedingJoinPoint.getSignature().getName();Object[] arguments = proceedingJoinPoint.getArgs();return getAspectMethodLogDesc(targetName, methodName, arguments);}/*** @param targetName* @param methodName* @param arguments* @author xiaofu* @description 自定义注解参数* @date 2020/7/15 11:51*/public String getAspectMethodLogDesc(String targetName, String methodName, Object[] arguments) throws Exception {Class targetClass = Class.forName(targetName);Method[] methods = targetClass.getMethods();StringBuilder description = new StringBuilder("");for (Method method : methods) {if (method.getName().equals(methodName)) {Class[] clazzs = method.getParameterTypes();if (clazzs.length == arguments.length) {description.append(method.getAnnotation(PrintlnLog.class).description());break;}}}return description.toString();}
}
三、应用

我们在需要打印入参和返回结果日志的方法,加上@PrintlnLog注解,并添加自定义方法描述。

@RestController
@RequestMapping
public class OrderController {@Autowiredprivate OrderService orderService;@PrintlnLog(description = "订单详情Controller")@RequestMapping("/order")public OrderDTO getOrder(OrderVO orderVO, String name) {OrderDTO orderInfo = orderService.getOrderInfo(orderVO);return orderInfo;}
}

参考:https://cloud.tencent.com/developer/article/1666067?from=article.detail.1629585

运用aop做日志,实现请求方法的入参、返回结果日志统一打印,避免日志打印格式杂乱,同时减少重复代码相关推荐

  1. AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)

    AOP注解@Before.@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一) 问题背景 AOP注解@Before.@AfterReturni ...

  2. Spring Boot AOP处理方法的入参和返回值

    前言 IOC和AOP是Spring 中最重要的两个模块.这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值. Spring AOP的简单介绍: AOP(Aspect-Orient ...

  3. SpringMVC自动将请求参数和入参对象的属性进行一一绑定;要求请求参数的名字和javaBean入参的对象里面的属性名是一样的||员工的增删改查案例

    SpringMVC自动将请求参数和入参对象的属性进行一一绑定:要求请求参数的名字和javaBean入参的对象里面的属性名是一样的 1.SpringMVC中配置HiddenHttpMethodFilte ...

  4. aop统计请求数量_Spring-Boot+AOP+统计单次请求方法的执行次数和耗时情况-Go语言中文社区...

    本篇结合aop(面向切面编程)的特性,对spring-boot项目下后端开发人员所关心的java代码的性能做了一次简单的统计,比如,前端发了一个post请求(一连串数据的保存),到了后端,首先是指定C ...

  5. aop 获取方法入参出参_Spring AOP获取请求URL的入参及返回值(通用方法)

    以下代码为通用的代码,其中json解析使用的是fastJson,可以记录用户访问的ip.url.入参和出参 /** * @author jasonLu * @date 2017/10/26 9:57 ...

  6. aop对请求后端的参数修改_Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理...

    对于spring框架来说,最重要的两大特性就是AOP 和IOC. 以前一直都知道有这两个东西,在平时做的项目中也常常会涉及到这两块,像spring的事务管理什么的,在看了些源码后,才知道原来事务管理也 ...

  7. List.addAll方法的入参不能为null

    缘由: ​ 某天,发现一段日志中出现了诡异的NPE.经过定位,认为是ArrayList不能加入null所致. 验证: ​ new一个ArrayList,然后调用其addAll方法,并将入参设为null ...

  8. python函数和方法的入参格式有哪些_Python函数的参数常见分类与用法实例详解

    本文实例讲述了Python函数的参数常见分类与用法.分享给大家供大家参考,具体如下: 1.形参与实参是什么? 形参(形式参数):指的是 在定义函数时,括号内定义的参数,形参其实就是变量名 实参(实际参 ...

  9. 关于solidity解析abi方法,入参和结果字节码

    引入依赖,github可以找到 <dependency><groupId>com.esaulpaugh</groupId><artifactId>hea ...

最新文章

  1. 通用分页实现及其OO设计探讨
  2. mongodb mongoose 常用操作符号 整理
  3. winform 图片集合
  4. python学习精华——成长篇
  5. 手动同步OCS的通讯簿
  6. Boost库编译安装
  7. Effective C++ -----条款42:了解typename的双重意义
  8. kali Linux 系统安装教程
  9. 3DMAX 卸载工具,完美彻底卸载清除干净3dmax各种残留注册表和文件
  10. 安卓逆向_2 --- Androidkiller,apktool、dex2jar、jd-gui、jadx反编译工具 的 安装、设置及使用教程
  11. 蓝牙技术|伦茨科技智能语音遥控器方案简介
  12. 古风排版 分数 20作者 陈越单位 浙江大学
  13. 【MySQL】用假期时间学习数据库,稳赚不亏(存储、视图、事务、优化、安全)
  14. 2017中国云计算技术大会将于5月18-19日在京召开
  15. 如何搭建一个属于自己的网站
  16. win10计算机 需要新应用,手把手为你win10系统商店出现“需要新应用打开此ms-windows-store”的还原步骤...
  17. 计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...
  18. VMvare win7软件闪退
  19. 线性代数matlab求一个正交矩阵,线性代数求一个正交矩阵P,是P^-1AP= – 手机爱问...
  20. 达内学软件测试发证书吗,达内软件测试培训让我拥有了实际工作经验

热门文章

  1. Win7延迟90秒启动exe文件
  2. Unity3D官方二维游戏开发教程中文版分享
  3. 宽屏首页列表翻页教程网(带手机) v5.26
  4. 历史大讲堂:iPhone为啥这么火?苹果系统历史回顾(下)
  5. 关于编程,我要矫情两句
  6. 如何提高职场说服力?看这本书就对了
  7. JAVA王大师-易经风水布局秘笈
  8. 趣谈js的call和apply两大召唤术
  9. 安全运维理念(半神半仙亦民工)
  10. 计算机图形学笔记 || 建模与消隐