使用AOP进行操作日志和异常日志处理。

操作日志:

1、定义annotation,可参考自己的需要进行修改

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    // 模块
    String model();
    // 类型
    int type();
    // 说明
    String desc();
}

 

2、AOP捕获注释的方法

@Pointcut("@annotation(com.注解所在包.Log)")
private void log() {}

@AfterReturning("log() && @annotation(log)")
public void logHandler(Log log) {
    asyncService.saveLogOperation(log);  // 异步写入日志,log.model(),log.type(),log.desc()获取属性
}

3、在controller方法上添加注解(示例)

@Log(model = "m", type = LogType.MODIFY, desc = "修改内容")
public String method() { ... }

异常日志:

1、AOP捕获异常

@Pointcut("execution(* com.自己的包.controller..*(..))")
private void execption() {}

@AfterThrowing(pointcut = "execption()", throwing = "e")
public void execptionHandler(JoinPoint joinPoint, Throwable e) {
    asyncService.saveLogException(joinPoint, e);  // 异步写异常日志,JoinPoint可以反射获取方法
}

利用JoinPoint获取请求的类名和方法名

MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
String methodName = method.getName();
String className = joinPoint.getTarget().getClass().getName();

获取HttpServletRequest

private HttpServletRequest getRequest() {
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    if (requestAttributes == null) {
        return null;
    }
    return (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
}

通过上述两者和异常,即可获得大部分需要的参数,具体方式可自行查询,资源丰富。


知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。