文章目录
- 前言
- 一、实现一个全局日志打印
- 二、使用步骤
-
* [1\. 新增一个自定义注解](about:blank#1__14) - 总结
前言
项目中有时候为了与前端,与后端(微服务/远程调用http) 等撕逼,我们不得不做好应对措施,最终的就是打印清晰我们的入参出参日志,这为以后撕逼,查找问题,快速定位bug,都会非常有利;
一、实现一个全局日志打印
每个方法,请求,自己打印入参,出参,当然不行了,太复杂了,有一天让你改下打印风格,那岂不是要全都改一遍,又或者加一下每个请求的处理时长,那岂不是要累死~,为了一劳永逸,我们就用自定义注解实现吧!
二、使用步骤
1.
新增一个自定义注解
/**
* 打印日志 出参入参
*
* @author fulin
* @since 2023/6/16 10:54
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface CustomizationLog {}
2.
拦截注解,并实现相应的打印日志功能
-
这里我们采用StopWatch 来统计接口处理耗时
-
利用@Around 环绕通知,打印入参,以及处理之后的回参
/**
-
日志拦截打印实现类
-
@author fulin
-
@since 2023/6/16 10:56 */ @Aspect @Component @Slf4j public class CustomLogAspect {
/**
-
日志拦截打印实现类
-
@param jp ProceedingJoinPoint
-
@return 返回参数 */ @Around(value = "@annotation(CustomizationLog)") @SneakyThrows public Object aroundLog(ProceedingJoinPoint jp) { Signature signature = jp.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); // 获取请求参数 Object[] args = jp.getArgs(); String[] parameterNames = new DefaultParameterNameDiscoverer().getParameterNames(method); HashMap<Object, Object> map = MapUtil.newHashMap(); if (ArrayUtil.isNotEmpty(args)) { for (int i = 0; i < args.length; i++) { assert parameterNames != null; map.put(parameterNames[i], args[i]); } } StopWatch stopWatch = new StopWatch(); stopWatch.start(); String name = method.getName(); LOG.info("拦截的方法:{}, 入参: {}", name, JSON.toJSONString(map)); Object proceed = jp.proceed(); LOG.info("拦截的方法:{}, 返参: {}", name, JSON.toJSONString(proceed)); stopWatch.stop(); LOG.info("{}方法 执行时长: {}ms", name, stopWatch.getLastTaskTimeMillis()); return proceed; } }
-
-
3. 使用
-
加在控制器的请求上
-
加载实现类的方法上
打印效果如下
总结
虽不复杂,但是在实际项目中应用的话,还是很称心如意的~,而且在此基础上,还能根据自己的需要扩展就好了;
本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。