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 }

# 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 }

使用方式:

    在需要的方法加上@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

原文地址:https://www.cnblogs.com/wulm/p/9157241.html

时间: 2024-09-29 22:47:46

spring aop 方法增加日志记录的相关文章

Spring AOP 实现业务日志记录

1. 用户管理业务逻辑接口(UserManagerApplogic.java ) Java代码   package com.iteye.applogic; public interface UserManagerApplogic { public void addUser(String name); } 2. 用户管理业务逻辑实现类(UserManagerApplogicImpl.java) Java代码   package com.iteye.applogic.impl; import org

Spring AOP实例——异常处理和记录程序执行时间

实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动代理功能,然后一个用Java的动态代理,一个用CGLIB代理. 实现思路: 首先定义负责异常处理的Advice:ExceptionHandler.java,定义记录程序执行时间的Advice:TimeHandler.java 然后定义业务逻辑接口LogicInterface.java,编写实现业务逻

HAproxy增加日志记录功能和自定义日志输出内容、格式

一.增加haproxy日志记录功能 1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我们先来了解一下日志的level:local0-local7 16-23保留为本地使用 emerg 0 系统不可用     alert 1 必须马上采取行动的事件     crit 2 关键的事件     err 3 错误事件     warning 4 警告事件     notice 5 普通但重要的事件     info 6 有用的信息     debug 7 调试信息

12.7 给计算增加日志记录

日志通常可以使用全局可变状态实现.然而,如果我们想要避免使用全局可变状态,并保持程序的纯函数性,那又该如何呢?我们有一个选择,就是把日志记录器的状态作为额外的参数值,传递我们要调用的每个函数.实现可能非常困难(想象一下,如果我们决定将另一个参数添加到这个状态中!). 要解决这个问题,我们可以创建自定义计算类型,启用了日志记录,把日志记录器的状态隐藏在计算类型内.这类似于在无任何副作用的纯函数式语言中, Haskell 使用的技术,嵌入处理状态(比如,文件系统).我们要实现的示例依赖于这样的事实,

配置Haproxy增加日志记录功能

CentOS 7上yum安装的Haproxy,默认没有记录日志.需要做一下配置才能记录日志. 1.创建日志文件/var/log/haproxy/haproxy.log cd /var/log sudo mkdir haproxy cd haproxy sudo touch haproxy.log sudo chmod a+w haproxy.log 2.开启rsyslog的haproxy日志记录功能 编辑/etc/rsyslog.conf文件,将 $ModLoad imudp $UDPServe

剑指架构师系列-spring boot的logback日志记录

Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志对象,也可以定义日志类型.级别. 级别:ERROR.WARE.INFO.DEBUG和TRACE.没有FATAL,归纳到了ERROR级别里.ERROR.WARN and INFO level messages are logged by default. 在Spring Boot中,最好定义为logb

php之框架增加日志记录功能类

<?php /* 思路:给定文件,写入读取(fopen ,fwrite……) 如果大于1M 则重写备份 传给一个内容, 判断大小,如果大于1M,备份 小于则写入 */ class Log{ //定义一个常量,创建一个文件的名称 const LOGFILE = 'curr.log'; //写入文件 public static function write($cont){ $cont .="\r\n"; $log = self::isBak(); //计算文件的地址,判断大小 $fh

关于 Spring AOP (AspectJ) 你该知晓的一切

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/54629058 出自[zejian的博客] 关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 本篇是年后第一篇博文,由于博主用了不少时间在构思这篇博文,加上最近比较忙,所以这篇文件写得比较久,也分了不同的时间段在写,已尽最大能力去连贯博文中的内容

Spring AOP的本质

不用再百科什么AOP了,我先推荐几篇文章或者系列文章:(感谢这些博文的原作者) 0.  Spring AOP 详解   http://pandonix.iteye.com/blog/336873/ 1.  AOP技术基础系列     http://wayfarer.cnblogs.com/articles/241024.html 2.  我对AOP的理解 http://jinnianshilongnian.iteye.com/blog/1474325 3.  Spring AOP本质系列  ht