当然,记录系统日志方式可以由很多,这里介绍一种采用注解的方式,结合spring aop反向代理的方式,输出特定日志信息,此方式的作用场景还有很多,像针对方法级的权限控制等等 (aop真的是一个好东西)
首先
先定义一个自定义注解
/**
* 系统日志注解
*
* Create by yu
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
然后
定义一个切面类
/**
* 系统日志,切面处理类
*
* Create by yu
*/
@Aspect
@Component
public class SysLogAspect {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("@annotation(com.sskj.utils.annotation.SysLog)")
public void logPointCut() {
}
@Before("logPointCut()")
public void saveSysLog(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLog syslog = method.getAnnotation(SysLog.class);
if(syslog != null){
//注解上的描述
}
//请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
//请求的参数
Object[] args = joinPoint.getArgs();
String params = JSON.toJSONString(args[0]);
logger.info(String.format("类名:%s,方法名:%s,请求参数为:%s",className,methodName,params));
}
}
可以看到 切点就是定义的注解@SysLog 通过反向代理的方式获得类名,注解注释,方法名,参数等信息