自定义注解+面向切面整合的日志记录模块(二)
自定义操作日志记录注解:
/** * 自定义操作日志记录注解 */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { /** * 模块 */ String title() default ""; /** * 功能 */ BusinessType businessType() default BusinessType.OTHER; /** * 操作人类别 */ OperatorType operatorType() default OperatorType.MANAGE; /** * 是否保存请求的参数 */ boolean isSaveRequestData() default true; }
两个枚举类相关代码:
/** * 业务操作类型 * * @author ruoyi * */ public enum BusinessType { /** * 其它 */ OTHER, /** * 新增 */ INSERT, /** * 修改 */ UPDATE, /** * 删除 */ DELETE, /** * 授权 */ GRANT, /** * 导出 */ EXPORT, /** * 导入 */ IMPORT, /** * 强退 */ FORCE, /** * 生成代码 */ GENCODE, /** * 清空数据 */ CLEAN, }
/** * 操作人类别 * * @author ruoyi * */ public enum OperatorType { /** * 其它 */ OTHER, /** * 后台用户 */ MANAGE, /** * 手机端用户 */ MOBILE }
面向切面处理并记录日志:
@Aspect @Component public class LogAspect { private static final Logger log = LoggerFactory.getLogger(LogAspect.class); // 配置织入点 @Pointcut("@annotation(com.kss.framework.aspectj.annotation.Log)") public void logPointCut() { } /** * 处理完请求后执行 * * @param joinPoint 切点 */ @AfterReturning(pointcut = "logPointCut()") public void doAfterReturning(JoinPoint joinPoint) { System.out.println("处理完请求后执行"); handleLog(joinPoint, null); } /** * 拦截异常操作 * * @param joinPoint 切点 * @param e 异常 */ @AfterThrowing(value = "logPointCut()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Exception e) { System.out.println("出现异常"); handleLog(joinPoint, e); } /** * 记录日志 * @param joinPoint * @param e */ protected void handleLog(final JoinPoint joinPoint, final Exception e) { try { // 获得注解 Log controllerLog = getAnnotationLog(joinPoint); if (controllerLog == null) { return; } if (e != null) { System.out.println("expection:"+e.getMessage()); }else { log.info("==后置通知增强=="); } // 设置方法名称 String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); System.out.println("className:"+className); System.out.println("methodName:"+methodName); // 处理设置注解上的参数 System.out.println("businessType:"+controllerLog.businessType()); System.out.println("operatorType:"+controllerLog.operatorType()); System.out.println("isSaveRequestData:"+controllerLog.isSaveRequestData()); System.out.println("title:"+controllerLog.title()); } catch (Exception exp) { // 记录本地异常日志 log.error("==前置通知异常=="); log.error("异常信息:{}", exp.getMessage()); exp.printStackTrace(); } } /** * 是否存在注解,如果存在就获取 */ private Log getAnnotationLog(JoinPoint joinPoint) throws Exception { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) { return method.getAnnotation(Log.class); } return null; } }
使用@Pointcut注解进行定义切点函数,在通知函数中可直接使用切点函数名称
测试日志:
@Component public class TestLog { @Log(title = "测试日志") public void sum() { System.out.println("sum:" + (1 + 2)); } }
@RunWith(SpringRunner.class)
@SpringBootTest
public class CollectionApplicationTests {
@Test
public void contextLoads() {
}
@Autowired
private TestLog testLog;
@Test
public void testAspect(){
testLog.sum();
}
}