使用场景:

  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. 图像处理之基础---彩色转灰度算法优化rgb to yuv

    File:      StudyRGB2Gray.txtName:      彩色转灰度算法彻底学习Author:    zyl910Version:   V1.0Updata:    2006-5- ...

  2. js生成页面水印

    路: 获取想要插入水印的文档节点的顶点坐标值x,y. 获取文档节点的高度heigt和宽度width. 用div包裹文字来生成水印. 定义好div的长宽高间距等各种属性. 定义虚拟节点createDoc ...

  3. 用js采集网页数据并插入数据库最快的方法

    今天教大家一个快速采集网站数据的方法,因为太晚了,直接上例子,这里以采集易车网的产品数据为例. 思路:利用js获取网页数据并生成sql命令,执行sql命令把采集的数据插入数据库. 1.用谷歌浏览器或者 ...

  4. 从EJB规范理解微服务

    晚上看了一篇从JavaEE谈微服务的文章,里面不少观点还是很有启发的,下面最有感触的,从失败的EJB谈微服务. 说起JavaEE规范,要先从EJB(Enterprise Java Bean),他是一种 ...

  5. WP8 中使用HTML Agility Pack与友盟分享SDK遇到的 System.Xml.XPath加载问题

    今晚在尝试使用友盟最新的社交分享SDK时,按照官方Demo,并未做多少多少改动,就是去除了对微信.脸书和推特的分享.然后运行之后就一直报错 : {System.IO.FileLoadException ...

  6. JForum论坛添加UEditor文本编辑器

    在使用JForum论坛中发现论坛自带的文本编辑器不好用,不能上传图片,样式编辑也很麻烦,就想着把这个文本编辑器替换掉,我这里选用的是百度的开源富文本编辑器UEditor 替换后的效果图 替换方法如下 ...

  7. E20171226-hm

    stack n.栈 heap  n.堆 backtracking 回溯法,後戻り storage  n. 贮存; 贮藏; 储藏处,仓库; 贮存器,蓄电(瓶); ストレージ

  8. Akka源码分析-Akka-Streams-概念入门

    今天我们来讲解akka-streams,这应该算akka框架下实现的一个很高级的工具.之前在学习akka streams的时候,我是觉得云里雾里的,感觉非常复杂,而且又难学,不过随着对akka源码的深 ...

  9. 第三章 K近邻法(k-nearest neighbor)

    书中存在的一些疑问 kd树的实现过程中,为何选择的切分坐标轴要不断变换?公式如:x(l)=j(modk)+1.有什么好处呢?优点在哪?还有的实现是通过选取方差最大的维度作为划分坐标轴,有何区别? 第一 ...

  10. 读懂mysql慢查询日志

    我们来看一下如何去读懂这些慢查询日志.在跟踪慢查询日志之前,首先你得保证最少发生过一次慢查询.如果你没有可以自己制造一个:root@server# mysql -e 'SELECT SLEEP(8); ...