使用场景:

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

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

一言不合,上代码:

# 枚举类

 package xxxxxxxxxx;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @desc 记录提交参数和返回值
*/
@Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME)
public @interface MethodLog { /**
*
* @desc 描述; 如:短息接口
*/
String value() default "";
}

# aop类

 package xxxxxxx;

 import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Configuration; import com.yunyihenkey.common.annotation.MethodLog;
import com.yunyihenkey.common.utils.JacksonUtils;
import com.yunyihenkey.common.utils.LogUtils; /**
*
* @desc 拦截方法的入参信息和返回信息
*/
@Aspect
@Configuration
public class MethodLogAop {
public static final String NULL_STR = "无"; @Pointcut(value = "@annotation(com.yunyihenkey.common.annotation.MethodLog)")
public void pointcut() { } @Around(value = "pointcut()")
public Object service(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 获取拦截的方法名
MethodSignature msig = (MethodSignature) proceedingJoinPoint.getSignature();
// 获取到注解
MethodLog auth = msig.getMethod().getAnnotation(MethodLog.class);
// 获取方法参数
Object[] objectsArray = proceedingJoinPoint.getArgs(); // 纳秒时间戳
long nanoTime = System.nanoTime(); StringBuilder sb = new StringBuilder().append(nanoTime).append(":::调用").append(auth.value()).append(":::")
.append(msig.getDeclaringType().getSimpleName()).append(".").append(msig.getName());
int end = sb.length(); Logger logger = LogUtils.getLogger(); sb.append(":::传入参数:::");
if (objectsArray == null || objectsArray.length == 0) {
logger.info(sb.append(NULL_STR).toString());
} else {
for (int i = 0, z = objectsArray.length; i < z; i++) {
Object obj = objectsArray[i];
sb.append(",参数").append(i).append("=").append(
obj instanceof CharSequence ? (CharSequence) obj : JacksonUtils.writeValueAsString(obj));
}
logger.info(sb.toString());
} // 执行方法
Object resultObj = proceedingJoinPoint.proceed();
if (resultObj == null) {
resultObj = NULL_STR;
} // 删除上一次节点的文字
sb.delete(end, sb.length());
logger.info(sb.append(":::返回参数:::")
.append(resultObj instanceof CharSequence ? (CharSequence) resultObj
: JacksonUtils.writeValueAsString(resultObj))
.append(" !!!!!!耗时(ms):").append((System.nanoTime() - nanoTime) / 1000000)); return resultObj;
} }

使用方式:

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

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

  1. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  2. [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理

    设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...

  3. 【AOP】Spring AOP基础 + 实践 完整记录

    Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...

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

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

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

    http://blog.51cto.com/eric1/1854574 一.增加haproxy日志记录功能   1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我 ...

  6. springboot aop+@interface实现日志记录

    一.基本概念 1.自定义注解 自定义注解我们必须了解四个元注解,什么是元注解?元注解指作用于注解之上的元数据或者元信息,简单通俗的讲,元注解就是注解的注解 . Documented与Inherited ...

  7. Spring AOP实现统一日志输出

    目的: 统一日志输出格式 思路: 1.针对不同的调用场景定义不同的注解,目前想的是接口层和服务层. 2.我设想的接口层和服务层的区别在于: (1)接口层可以打印客户端IP,而服务层不需要 (2)接口层 ...

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

    Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...

  9. spring aop实现log 日志跟踪

    之前写的那篇是基于springboot的(https://www.cnblogs.com/yaoyuan2/p/10302802.html),由于遗留项目用的是spring,因此需要在spring基础 ...

随机推荐

  1. RK3288获取摄像头的Sensor ID【原创】

    平台信息:内核:linux3.0.68 系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:通过I2C总 ...

  2. MPMoviePlayerController属性方法简介

    属性 说明 @property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 @property (nonatom ...

  3. POJ2653 Pick-up sticks 判断线段相交

    POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...

  4. JeePlus:代码结构

    ylbtech-JeePlus:代码结构 1.返回顶部 1. 代码结构 1.文件结构 1.1.源码目录 src/main/javacom.jeeplus Jeeplus目录录├ common 公共模块 ...

  5. 列表渲染v-for

    v-for我们用v-for指令根据一组数据的选项列表进行渲染.v-for指令需要以item in items形式的特殊语法,items是源数据数组并且item是数组元素迭代的别名. demo: < ...

  6. 用户能够在下次登录系统时被重新配置---或win10早期更新不成功的bug就需要删除多余的登陆用户

    有时候我们希望删除本地计算机上的一位用户,或者期待一位用户能够在下次登录系统时被重新配置.但是仅删除%userprofile%目录是不够的,因为一个登录名会对应一个SSID,这个SSID还保留在注册表 ...

  7. codeforces 37 E. Trial for Chief【spfa】

    想象成一层一层的染,所以相邻的两个格子连边,边权同色为0异色为1,然后答案就是某个格子到距离它最远得黑格子的最短距离的最小值 注意特判掉不需要染色的情况 #include<iostream> ...

  8. GG_Model 类库与数据库表对应建立实体类

    3.4.GG_Model 类库与数据库表对应建立实体类 我这里不教大家写代码,直接用TT模板自动生成,省去写代码的麻烦. A. 三个文件MysqlDbhelper.ttinclude .mysqlMa ...

  9. 洛谷 P1433 吃奶酪(记忆化)

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  10. JAXB解析xml 的注解说明

      1.将 xml 文件中的各个节点和属性信息创建对应的Java模型 2.在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示@XmlRootElement   将一个Java类映射 ...