| 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); | 
|             } | 
|         } | 
|     } | 
| } |