文章目录
- 前言
- 一、实现一个全局日志打印
- 二、使用步骤
- 1. 新增一个自定义注解
- 2. 拦截注解,并实现相应的打印日志功能
- 3. 使用
- 总结
前言
项目中有时候为了与前端,与后端(微服务/远程调用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. 使用
-
加在控制器的请求上
-
加载实现类的方法上
打印效果如下
总结
虽不复杂,但是在实际项目中应用的话,还是很称心如意的~,而且在此基础上,还能根据自己的需要扩展就好了;