切面通用父类
这里实现抽象日志记录类
,里面写好了对请求的信息(url、方法、请求头信息、参数)等信息,并对执行的controller的方法名、方法参数值进行记录,无论方法执行完成或者执行异常都会有相应的记录输出。也可以通用继承这个·抽象类·来实现自定义的日志记录。这里主要用了环绕通知及异常通知。里面使用了自定义注解
,用于对当前执行的方法进行说明,方便日志观察。抽象类中的方法已经写好了切面能得到的所有信息,可以根据需要个性化定制。
package com.langangkj.home.cloud.common.aspect;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.langangkj.home.cloud.common.annotation.MethodLogDesc;
import com.langangkj.home.cloud.common.util.RequestUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Map;
/**
* @author ZhouChuGang
* @version 1.0
* @project ImageWeb
* @date 2019/11/30 17:56
* @Description 切面实现日志记录 记录每次请求的信息 抽象类 方便子类重写
*/
@Slf4j
public abstract class AbstractWebLogAspect {
@Autowired
private ObjectMapper objectMapper;
/**
* 切入点
* 子类可以重写
*/
@Pointcut(
"@annotation(org.springframework.web.bind.annotation.RequestMapping) || " +
"@annotation(org.springframework.web.bind.annotation.GetMapping)||" +
"@annotation(com.langangkj.home.cloud.common.annotation.MethodLogDesc) || " +
"@annotation(org.springframework.web.bind.annotation.PostMapping)"
)
protected void webLog() {
}
/**
* 得到当前请求需要记录的信息
*
* @param request
* @return
*/
protected String getHttpServletRequestLogInfoStr(HttpServletRequest request) {
// 记录下请求内容
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("URL:%s, HTTP_METHOD:%s, IP:%s \n", RequestUtil.getRequestUrl(), request.getMethod(), RequestUtil.getIpAddr(request)));
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
StringBuilder headStr = new StringBuilder();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String header = request.getHeader(name);
headStr.append(name).append(":").append(header).append("\n");
}
stringBuilder.append(String.format("header: %s", headStr.toString()));
}
Map<String, String[]> parameterMap = request.getParameterMap();
if (parameterMap != null && !parameterMap.isEmpty())