/**
* @ClassName: LogAspect
* @Description: 日志记录AOP实现
*/
@Component
@Aspect
public class LogAspect {
private final static Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("execution(* com.**.**.**.controller.*.*(..))")
public void pointcut() {
}
/**
* 记录程序运行时候抛出的异常信息
*/
@AfterThrowing(pointcut = "pointcut()", throwing = "ex")
public void doThrowing(JoinPoint joinPoint, Exception ex) {
HttpServletRequest request;
try {
request = getHttpServletRequest();
} catch (Exception e) {
return;
}
// 获取输入参数
String queryString = request.getQueryString();
String method = request.getMethod();
String params = "";
if ("get".equalsIgnoreCase(method)) {
params = queryString;
} else if ("post".equalsIgnoreCase(method)) {
params = JsonUtils.getJSONString(request.getParameterMap());
}
String methodName = joinPoint.getSignature().getName();
logger.error("[请求:[{}];参数:[{}];方法:[{}]发生异常,原因: ]",
request.getRequestURI(), params, methodName, ex);
}
private HttpServletRequest getHttpServletRequest() {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
return sra.getRequest();
}
/**
* @Title:doAround
* @Description: 环绕触发
*/
@Around(value = "pointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.currentTimeMillis();
HttpServletRequest request;
HttpSession session;
try {
request = getHttpServletRequest();
session = request.getSession();
} catch (Exception e) {
return pjp.proceed();
}
// 获取输入参数
String queryString = request.getQueryString();
String method = request.getMethod();
String requestURI = request.getRequestURI();
String params = "";
if ("get".equalsIgnoreCase(method)) {
params = queryString;
} else if ("post".equalsIgnoreCase(method)) {
params = JsonUtils.getJSONString(request.getParameterMap());
}
// 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
Object result = pjp.proceed();// result的值就是被拦截方法的返回值
logger.info("[用户[{}];请求:[{}];请求方式:[{}];参数:[{}];结果:[{}]; 耗时:[{}]ms]",
session.getAttribute(USER), requestURI, method, params,
result, System.currentTimeMillis() - startTime);
return result;
}
}