使用场景:

  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. MySQL InnoDB 快速导入数据

    今天把需要分析的数据导入到数据库中. 数据将近7000万条,在txt文件中存放,共5.75G.采用Load data infile 导入,最后花了18个小时导入.主要做了以下修改: 1. MySQL优 ...

  2. Aaron Swartz Rewriting Reddit中关于web.py的创建思路

    这天才少年居然自杀了,哎 原文点这 So how should things work? The first principle is that code should be clear and si ...

  3. Chrome查看JavaScript函数

    在页面上右键view page source(Ctrl+U),然后在弹出来的界面可以查找JavaScript函数 注意:这个只能看到内嵌在网页上的JavaScript函数 一般来讲,JavaScrip ...

  4. pgsql数据库应用两点注意

    今天在写一个sql脚本时遇到了两个问题,记录一下. 1,pgsql中没有select top n语句,可以用limit n代替. 2,pgsql可以在定义函数存储过程时使用变量,但要注意函数定义中的函 ...

  5. JS复制文件(转)

    <script type="text/javascript"> var fso, f; function copyFile() { fso = new ActiveXO ...

  6. 让你彻底明白JAVA中堆与栈的区别

    原文地址:http://www.2cto.com/kf/201302/190704.html 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象 ...

  7. 如何快速删除Linux下的svn隐藏文件及其他临时文件 (转载)

    转自:http://blog.csdn.net/edsam49/article/details/5840489 在Linux下,你的代码工程如果是用svn进行管理的,要删除Linux kernel里的 ...

  8. MySQL基础 — 常用命令

    一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MySQ: 首先在打开cmd窗口,输入mysql -uroot -p ,然后空格进入MySQL控制台, ...

  9. [Swift通天遁地]一、超级工具-(6)通过JavaScript(脚本)代码调用设备的源生程序

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. 课后题--------求分子量-----Molar mass------

    简单的化学式  求分子量问题 下面附上  代码和解析. #include<stdio.h> #include<algorithm> #include<string.h&g ...