spring aop 方法增加日志记录
使用场景:
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 方法增加日志记录的更多相关文章
- Spring aop+自定义注解统一记录用户行为日志
写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...
- [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理
设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...
- 【AOP】Spring AOP基础 + 实践 完整记录
Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...
- Spring AOP实例——异常处理和记录程序执行时间
实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...
- HAproxy增加日志记录功能和自定义日志输出内容、格式
http://blog.51cto.com/eric1/1854574 一.增加haproxy日志记录功能 1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我 ...
- springboot aop+@interface实现日志记录
一.基本概念 1.自定义注解 自定义注解我们必须了解四个元注解,什么是元注解?元注解指作用于注解之上的元数据或者元信息,简单通俗的讲,元注解就是注解的注解 . Documented与Inherited ...
- Spring AOP实现统一日志输出
目的: 统一日志输出格式 思路: 1.针对不同的调用场景定义不同的注解,目前想的是接口层和服务层. 2.我设想的接口层和服务层的区别在于: (1)接口层可以打印客户端IP,而服务层不需要 (2)接口层 ...
- 剑指架构师系列-spring boot的logback日志记录
Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...
- spring aop实现log 日志跟踪
之前写的那篇是基于springboot的(https://www.cnblogs.com/yaoyuan2/p/10302802.html),由于遗留项目用的是spring,因此需要在spring基础 ...
随机推荐
- Android解析程序包时出现问题
Android用户下载我们wcc应用时,偶尔会出现“解析程序包出现问题”的的现象,以下是逐步排查的相关经验: 1. 首先确保这个包本身没有问题. 检测方法:其他手机采用同样的下载方式再下载一次. 解决 ...
- 内容可编辑且随内容自增长的div
<!DOCTYPE HTML> <html> <head> <title></title> <meta http-equiv=&quo ...
- debug 和release 的区别
http://blog.csdn.net/h_wlyfw/article/details/26688677
- Error Handling Functions(微软对于出错的情况下提供的所有函数,比如SetThreadErrorMode,SetErrorMode,SetLastErrorEx,FatalAppExit,CaptureStackbackTrace)
The following functions are used with error handling. Function Description Beep Generates simple ton ...
- beego3---gohttp底层实现
package main //gohttp底层实现,通过gohttp不是通过beego实现的输出 // import ( "io" "log" "ne ...
- SQL SERVER 安装软件 及导入项目流程
1.安装sqlsever2000及以上 数据库 (在百度上找安装文档) 创建账户 密码 2.解压SQL2000-KB884525-SP4-x86-CHS.EXE补丁 之后安装补丁 ,在安装补丁是会用到 ...
- Ruby on Rails5 直接的路径无效问题
比如设置个背景 background = "../../assets/images/test1.jpg" 会发现无效 网上一翻,Rails里面直接指定无效. 解决方法就是把 ...
- bzoj 2442: [Usaco2011 Open]修剪草坪【单调栈】
设f[i]为i不选的最小损失,转移是f[i]=f[j]+e[i[(i-j-1<=k) 因为f是单调不降的,所以f[j]显然越靠右越好因为i-j-1<=k的限制,所以单调栈需要弹栈 #inc ...
- Too many open files故障解决一例
Linux环境WebSphere输出日志: [// ::: EDT] 000090b7 SystemErr R Caused by: java.io.FileNotFoundException: /o ...
- Android 性能优化(4)Optimizing Layout Hierarchies:用Hierarchy Viewer和Layoutopt优化布局
Optimizing Layout Hierarchies This lesson teaches you to Inspect Your Layout Revise Your Layout Use ...