老鸟是这样实现springboot日志打印的~

89 阅读1分钟

文章目录


前言

项目中有时候为了与前端,与后端(微服务/远程调用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…,如有侵权,请联系删除。