
正文
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






