package com.zhonggu.websocket.config.webService;
import com.zhonggu.websocket.until.controller.AbstractBaseController;
import com.zhonggu.websocket.until.json.JsonUntil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;
@Slf4j
@Aspect
@Component
public class WebServiceLogAspect extends AbstractBaseController {
public static ThreadLocal<Long> currentThreadId = new ThreadLocal<>();
public static ThreadLocal<StringBuffer> apiUrl = new ThreadLocal<>();
public static ThreadLocal<Long> callTime = new ThreadLocal<>();
@Value("${spring.profiles.active}")
private String env;
@Pointcut("execution(* com.zhonggu.websocket.controller.*Controller.*(..))")
protected void loggingOperation() {
}
@Before("loggingOperation()")
@Order(1)
public void logJoinPoint(JoinPoint joinPoint) {
HttpServletRequest request = getRequest();
callTime.set(System.currentTimeMillis());
apiUrl.set(request.getRequestURL());
currentThreadId.set(System.currentTimeMillis());
StringBuilder logger = new StringBuilder("\n" + "**************[" + currentThreadId.get() + "]请求内容开始了**************"
+ "\n" + "请求地址:" + request.getRequestURI() + "\n" + "请求方式:" + request.getMethod() + "\n" + "请求类方法:" + joinPoint.getSignature() + ":" + joinPoint.getSignature().getName()
);
try {
if (RequestMethod.GET.name().equals(request.getMethod())) {
logger.append("\n" + "请求类方法参数:");
Map<String, String[]> map = request.getParameterMap();
String s = JsonUntil.object2json(map);
logger.append(s);
} else if (RequestMethod.POST.name().equals(request.getMethod())) {
logger.append("\n" + "请求类方法参数:");
String s = Arrays.toString(joinPoint.getArgs());
logger.append(s);
}
} catch (Exception e) {
logger.append("\n" + " 加载参数内容失败");
}
logger.append("\n" + "**************[").append(currentThreadId.get()).append("]请求内容结束**************");
log.info(logger.toString());
}
@AfterReturning(pointcut = "loggingOperation()", returning = "result")
@Order(2)
public void logAfter(JoinPoint joinPoint, Object result) {
long costTime = System.currentTimeMillis() - callTime.get();
log.info("\n" + "**************[" + currentThreadId.get() + "]返回内容开始了**************" + "\n" + "接口地址:" + apiUrl.get() + "\n" + "返回内容:" + JsonUntil.object2json(result) + "\n" + "请求耗时时间:" + costTime + "ms" + "" +
"\n" + "**************[" + currentThreadId.get() + "]返回内容结束**************");
remove();
}
@AfterThrowing(pointcut = "execution(* com.zhonggu.websocket.controller.*Controller.*(..))", throwing = "e")
@Order(3)
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
long costTime = System.currentTimeMillis() - callTime.get();
log.info("\n" + "**************[" + currentThreadId.get() + "]请求失败了**************" + "\n" + "接口地址:" + apiUrl.get() + "\n" + "请求失败:" + e.getMessage() + "\n" + "请求耗时时间:" + costTime + "ms" + "" +
"\n" + "请求错误类方法:" + joinPoint.getSignature() + ":" + joinPoint.getSignature().getName() + "\n" + "Cause:" + e.getCause() + "\n" + "**************[" + currentThreadId.get() + "]返回内容结束**************");
remove();
}
@Around("execution(* com.zhonggu.websocket.controller.*Controller.*(..))")
@Order(4)
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
try {
Object result = joinPoint.proceed();
log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result);
return result;
} catch (Exception e) {
log.info("\n" + "**************[" + currentThreadId.get() + "]请求抛异常了**************" + "\n" + "接口地址:" + apiUrl.get() + "\n" + "请求参数:" + Arrays.toString(joinPoint.getArgs()) +
"\n" + "请求抛异常类方法:" + joinPoint.getSignature() + ":" + joinPoint.getSignature().getName() + "\n" + "**************[" + currentThreadId.get() + "]异常抛出内容结束**************");
throw e;
}
}
public static void remove() {
currentThreadId.remove();
apiUrl.remove();
callTime.remove();
}
}
package com.zhonggu.websocket.until.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Locale;
public abstract class AbstractBaseController {
@Autowired
private MessageSource messageSource;
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
protected String getMessage(String key, String... args) {
return this.messageSource.getMessage(key, args, Locale.getDefault());
}
protected HttpServletRequest getRequest() {
return request;
}
protected HttpServletResponse getResponse() {
return response;
}
protected HttpSession getSession() {
return request.getSession();
}
protected ServletContext getApplication() {
return request.getServletContext();
}
}