当项目很大时,接口较多时,为了方便定位问题,我们会在每个类,每个方法中都加上日志,但是当开发人员较多时,日志格式就会不统一,有差异,查看日志时,也比较困难。
所以我们可以使用切面统一记录日志,避免了日志格式的差异,而且可以自定义或者直接将所有的接口日志记录。十分方便
进入正题
例子:
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日志中,都行)
可以看到记录接口的日志格式非常统一,这样子定位问题就非常方便了