zoukankan      html  css  js  c++  java
  • spring aop 方法增加日志记录

    使用场景:

      1:调用外部接口时需要记录出参和入参。

      2:分布式系统之间,调用各个系统之间需要记录日志,一旦出现了问题也可以找得到元数据

    一言不合,上代码:

    # 枚举类

     1 package xxxxxxxxxx;
     2 
     3 import java.lang.annotation.ElementType;
     4 import java.lang.annotation.Retention;
     5 import java.lang.annotation.RetentionPolicy;
     6 import java.lang.annotation.Target;
     7 
     8 /**
     9  * @desc 记录提交参数和返回值
    10  */
    11 @Target({ ElementType.METHOD })
    12 
    13 @Retention(RetentionPolicy.RUNTIME)
    14 public @interface MethodLog {
    15 
    16     /**
    17      * 
    18      * @desc 描述; 如:短息接口
    19      */
    20     String value() default "";
    21 }
    View Code

    # aop类

     1 package xxxxxxx;
     2 
     3 import org.apache.logging.log4j.Logger;
     4 import org.aspectj.lang.ProceedingJoinPoint;
     5 import org.aspectj.lang.annotation.Around;
     6 import org.aspectj.lang.annotation.Aspect;
     7 import org.aspectj.lang.annotation.Pointcut;
     8 import org.aspectj.lang.reflect.MethodSignature;
     9 import org.springframework.context.annotation.Configuration;
    10 
    11 import com.yunyihenkey.common.annotation.MethodLog;
    12 import com.yunyihenkey.common.utils.JacksonUtils;
    13 import com.yunyihenkey.common.utils.LogUtils;
    14 
    15 /**
    16  * 
    17  * @desc 拦截方法的入参信息和返回信息
    18  */
    19 @Aspect
    20 @Configuration
    21 public class MethodLogAop {
    22     public static final String NULL_STR = "无";
    23 
    24     @Pointcut(value = "@annotation(com.yunyihenkey.common.annotation.MethodLog)")
    25     public void pointcut() {
    26 
    27     }
    28 
    29     @Around(value = "pointcut()")
    30     public Object service(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    31 
    32         // 获取拦截的方法名
    33         MethodSignature msig = (MethodSignature) proceedingJoinPoint.getSignature();
    34         // 获取到注解
    35         MethodLog auth = msig.getMethod().getAnnotation(MethodLog.class);
    36         // 获取方法参数
    37         Object[] objectsArray = proceedingJoinPoint.getArgs();
    38 
    39         // 纳秒时间戳
    40         long nanoTime = System.nanoTime();
    41 
    42         StringBuilder sb = new StringBuilder().append(nanoTime).append(":::调用").append(auth.value()).append(":::")
    43                 .append(msig.getDeclaringType().getSimpleName()).append(".").append(msig.getName());
    44         int end = sb.length();
    45 
    46         Logger logger = LogUtils.getLogger();
    47 
    48         sb.append(":::传入参数:::");
    49         if (objectsArray == null || objectsArray.length == 0) {
    50             logger.info(sb.append(NULL_STR).toString());
    51         } else {
    52             for (int i = 0, z = objectsArray.length; i < z; i++) {
    53                 Object obj = objectsArray[i];
    54                 sb.append(",参数").append(i).append("=").append(
    55                         obj instanceof CharSequence ? (CharSequence) obj : JacksonUtils.writeValueAsString(obj));
    56             }
    57             logger.info(sb.toString());
    58         }
    59 
    60         // 执行方法
    61         Object resultObj = proceedingJoinPoint.proceed();
    62         if (resultObj == null) {
    63             resultObj = NULL_STR;
    64         }
    65 
    66         // 删除上一次节点的文字
    67         sb.delete(end, sb.length());
    68         logger.info(sb.append(":::返回参数:::")
    69                 .append(resultObj instanceof CharSequence ? (CharSequence) resultObj
    70                         : JacksonUtils.writeValueAsString(resultObj))
    71                 .append("  !!!!!!耗时(ms):").append((System.nanoTime() - nanoTime) / 1000000));
    72 
    73         return resultObj;
    74     }
    75 
    76 }
    View Code

    使用方式:

        在需要的方法加上@MethodLog("阿里发送短信接口")注解,注解内的字符串是描述内容。

    日志效果:

    2018-06-08 19:08:37.824 [INFO] [main] com.common.utils.springmanage.MethodLogAop.service(57) -
              35950692002844:::调用阿里发送短信接口:::TestAaaInterfaceWrapper.testHtml:::传入参数:::,参数0={"x":"","y":""}
    2018-06-08 19:08:38.013 [INFO] [main] com.common.utils.springmanage.MethodLogAop.service(68) -
              35950692002844:::调用阿里发送短信接口:::TestAaaInterfaceWrapper.testHtml:::返回参数:::{"errno":1,"data":[]} !!!!!!耗时(ms):261

  • 相关阅读:
    vue代码调试
    在vscode中无法使用yarn
    js滚动条计算公式
    chrome插件制作-高级篇
    网站js注入实现自动输入账号密码
    String、StringBuffer和StringBuilder有什么区别?
    待重写
    http协议
    待重写
    java内存加载机制
  • 原文地址:https://www.cnblogs.com/wulm/p/9157241.html
Copyright © 2011-2022 走看看