package com.mzl.flower.config; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.utils.IpUtil; import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("execution(public * com.mzl.flower.web.*.*Controller.*(..))") public void controllerLoggingPointcut() { } @Before("controllerLoggingPointcut()") public void logBefore(JoinPoint joinPoint) { } @AfterReturning(pointcut = "controllerLoggingPointcut()", returning = "jsonResult") public void logAfter(Object jsonResult) { } @Around("controllerLoggingPointcut()") public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { //程序开始的时间 long beginTime = System.currentTimeMillis(); String result = "success"; String errorMsg = ""; try { Object o = joinPoint.proceed(); return o; } catch (Throwable e) { if(e instanceof ValidationException){ result = "validate"; errorMsg = ((ValidationException) e).getErrorMessageKey(); }else{ result = "error"; final Writer writer = new StringWriter(); final PrintWriter print = new PrintWriter(writer); e.printStackTrace(print); errorMsg = e.getMessage(); } throw e; } finally { //程序结束的时间 long endTime = System.currentTimeMillis(); //程序运行结束的耗时 long requestTime = endTime - beginTime; // 接收到请求 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String logReturnMsg = "{\"startTime\":\"{}\",\"endTime\":\"{}\",\"method\":\"{}\",\"api\":\"{}\"" + ",\"ip\":\"{}\",\"duration\":\"{}\",\"result\":\"{}\",\"errorMsg\":\"{}\"}"; if("success".equals(result) || "validate".equals(result)){ logger.info(logReturnMsg, beginTime, endTime, request.getMethod(), request.getRequestURI(), IpUtil.getIpAddress(request), requestTime, result, errorMsg); }else{ logger.error(logReturnMsg, beginTime, endTime, request.getMethod(), request.getRequestURI(), IpUtil.getIpAddress(request), requestTime, result, errorMsg); } } } }