使用Spring Aop切面记录日志

当项目很大时,接口较多时,为了方便定位问题,我们会在每个类,每个方法中都加上日志,但是当开发人员较多时,日志格式就会不统一,有差异,查看日志时,也比较困难。

所以我们可以使用切面统一记录日志,避免了日志格式的差异,而且可以自定义或者直接将所有的接口日志记录。十分方便

进入正题

例子:

package com.miss.cloud.microservicesimpleprovideruser.log;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.google.gson.Gson;

/**
 * 切面日志类
 * 
 * @author Hang W
 * @date 2018-12-02 01:09:23
 */
@Component
@Aspect
public class LogAspect {

	private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
	
	@Pointcut("execution(* com.miss.cloud.microservicesimpleprovideruser.controller.UserController.*(..))")
	private void pointCut() {}
	
	@Around("pointCut()")
	public Object entry(ProceedingJoinPoint joinpoint) throws Throwable {
		
		// 方法名
		String method = joinpoint.getSignature().getName();
		
		// 接口入参
		// Object[] args = joinpoint.getArgs();
		
		// 调用实际接口耗时
		long start = System.currentTimeMillis();
		Object result = joinpoint.proceed();
		long end = System.currentTimeMillis();
		long cost = end - start;
		
		Gson gson = new Gson();
		String json = gson.toJson(result);
		
		// 记录日志
		log.info("LogAspect method={}, cost={}ms, result={}", method, cost, json);
		
		// 返回调用接口结果
		return result;
	}
}

说明:

1.这里使用springboot,可以不用配置文件,所以只需要在切面类上加上@Aspect注解即可

2.记录日志方式,因为要从接口入参到返回值都要记录,所以这里使用 around 环绕整个接口

3.ProceedingJoinPoint joinpoint 对象十分强大,可以获取接口入参,这里自行选择

4.切入点选择需要记录日志的类,类中的所有方法

调用接口,查看日志,这里我打印到控制台了(修改配置文件可以记录到log日志中,都行)

可以看到记录接口的日志格式非常统一,这样子定位问题就非常方便了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值