spring-boot使用springAOP对接口请求、异常、响应进行日志记录
日志切面类LogAspect
/**
* @Author: huyingquan2011@163.com
* @Date: Created by 9:47 2019/5/15
* @Description:
*/
@Aspect
@Component
public class WebLogAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
private static final ThreadLocal<Long> timeTreadLocal = new ThreadLocal<>();
@Pointcut("execution(* com.ehaoyao.springboot.controller..*.*(..)) ")
private void log(){}
@Before("log()")
private void doBefore(JoinPoint joinPoint) throws Throwable {
timeTreadLocal.set(System.currentTimeMillis());
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//获取请求的request
HttpServletRequest request = attributes.getRequest();
//获取所有请求的参数,封装为map对象
// Map<String,Object> parameterMap = getParameterMap(request);
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//获取被拦截的方法
Method method = methodSignature.getMethod();
//获取被拦截的方法名
String methodName = method.getName();
logger.info("请求方法 :{}", method.getDeclaringClass() + "." + methodName + "()");
//获取所有请求参数key和value
String keyValue = getReqParameter(request);
logger.info("请求url = {}", request.getRequestURL().toString());
logger.info("请求方式requestMethod = {}", request.getMethod());
logger.info("请求资源uri = {}", request.getRequestURI());
logger.info("所有的请求参数 key:value = {}", keyValue);
}
@After("log()")
public void after() {
logger.info("aop的after()方法");
}
//controller请求结束返回时调用
@AfterReturning(returning = "result", pointcut = "log()")
public Object afterReturn(Object result) {
logger.info("AOP afterReturn,返回值result = {}", result.toString());
// System.out.println("返回值="+result.toString());
long startTime = timeTreadLocal.get();
double callTime = (System.currentTimeMillis() - startTime) / 1000.0;
logger.info("调用controller花费时间time = {}s", callTime);
return result;
}
/**
* 获取所有请求参数,封装为map对象
*
* @return
*/
public Map<String, Object> getParameterMap(HttpServletRequest request) {
if (request == null) {
return null;
}
Enumeration<String> enumeration = request.getParameterNames();
Map<String, Object> parameterMap = new HashMap<String, Object>();
StringBuilder stringBuilder = new StringBuilder();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getParameter(key);
String keyValue = key + " : " + value + " ; ";
stringBuilder.append(keyValue);
parameterMap.put(key, value);
}
return parameterMap;
}
public String getReqParameter(HttpServletRequest request) {
if (request == null) {
return null;
}
Enumeration<String> enumeration = request.getParameterNames();
//StringBuilder stringBuilder = new StringBuilder();
JSONArray jsonArray = new JSONArray();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getParameter(key);
JSONObject json = new JSONObject();
//String keyValue = key+" : " +value+" ; ";
json.put(key, value);
//stringBuilder.append(keyValue);
jsonArray.add(json);
}
//JSONObject jsonObject = new JSONObject();
//jsonObject.put("请求参数为:",jsonArray.toString());
return jsonArray.toString();
}
}
pom文件引入aop
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
请求control异常全局监控
**
* @Author: huyingquan2011@163.com
* @Date: Created by 9:41 2019/5/15
* @Description:
*/
@ControllerAdvice(basePackages="com.ehaoyao.springboot.controller")
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> errorMsg(HttpServletRequest request,Exception e){
logger.info("异常链接: {}",request.getRequestURL().toString());
logger.info("异常信息: {}",e.getMessage());
Map<String, Object> errorMsgResult=new HashMap<>();
//errorMsgResult.put("code", e.);
errorMsgResult.put("msg", e.getMessage());
return errorMsgResult;
}
}