依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
LogsAspect.java
/**
* 日志切面
*
* @author 向振华
* @date 2018/11/29 14:27
*/
@Order(10)
@Slf4j
@Aspect
@Configuration
public class LogsAspect {
/**
* 请求地址
*/
private ThreadLocal<String> requestPath = new ThreadLocal<>();
/**
* 传入参数
*/
private ThreadLocal<String> inputMap = new ThreadLocal<>();
/**
* 输出结果
*/
private ThreadLocal<String> outputMap = new ThreadLocal<>();
/**
* 用户ID
*/
private ThreadLocal<Long> userId = new ThreadLocal<>();
/**
* 开始时间
*/
private ThreadLocal<Long> startTimeMills = new ThreadLocal<>();
/**
* 结束时间
*/
private ThreadLocal<Long> endTimeMills = new ThreadLocal<>();
@Before("execution(* com.rongyixin.sudaidai.cms.controller..*.*(..))")
public void doBeforeInServiceLayer() {
startTimeMills.set(System.currentTimeMillis());
}
@Around("execution(* com.rongyixin.sudaidai.cms.controller..*.*(..))")
public Object getReqAndResInfo(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//请求值
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
requestPath.set(request.getRequestURI());
if (request.getContentType() != null && request.getContentType().toLowerCase().contains("application/json")) {
inputMap.set(JSONObject.toJSONString(proceedingJoinPoint.getArgs()));
} else {
inputMap.set(JSONObject.toJSONString(request.getParameterMap()));
}
//响应值
Object res;
res = proceedingJoinPoint.proceed();
if (!(res instanceof ModelAndView)) {
String result = JSONObject.toJSONString(res);
if (StringUtils.isNotBlank(result)) {
if (result.length() > 200) {
result = result.substring(0, 200);
}
outputMap.set(result);
}
}
//用户
try {
CurrentUser currentUser = CurrentUser.get();
userId.set(currentUser.getUserId());
} catch (Exception e) {
userId.set(0L);
}
return res;
}
@After("execution(* com.rongyixin.sudaidai.cms.controller..*.*(..))")
public void doAfterInServiceLayer() {
endTimeMills.set(System.currentTimeMillis());
if (StringUtils.isNotBlank(outputMap.get())) {
printLog();
}
removeThreadLocal();
}
/**
* 回收ThreadLocal变量
*/
private void removeThreadLocal() {
userId.remove();
requestPath.remove();
inputMap.remove();
outputMap.remove();
startTimeMills.remove();
endTimeMills.remove();
}
/**
* 输出日志
*/
private void printLog() {
log.info("请求日志---> time:[{}],user:[{}],url:[{}],params:{},res:{}", endTimeMills.get() - startTimeMills.get(), userId.get(), requestPath.get(), inputMap.get(), outputMap.get());
}
}