java如何使用AOP记录日志呢?
下文笔者讲述java代码实现AOP记录日志的方法及示例分享,如下所示
AOP 记录日志的实现思路
1.定义日志表 2.定义注解 3.编写AOP为指定类做增强例
表结构 CREATE TABLE `operation_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `operate_class` varchar(200) DEFAULT NULL COMMENT '操作类', `operate_method` varchar(200) DEFAULT NULL COMMENT '操作方法', `return_class` varchar(200) DEFAULT NULL COMMENT '返回值类型', `operate_user` varchar(20) DEFAULT NULL COMMENT '操作用户', `operate_time` varchar(20) DEFAULT NULL COMMENT '操作时间', `param_and_value` varchar(500) DEFAULT NULL COMMENT '请求参数名及参数值', `cost_time` bigint(20) DEFAULT NULL COMMENT '执行方法耗时, 单位 ms', `return_value` varchar(200) DEFAULT NULL COMMENT '返回值', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; //自定义注解 @Inherited @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.Runtime) public @interface OperateLog { } //定义通知类 @Component @Aspect public class OperateAdvice { private static Logger log = Logger.getLogger(OperateAdvice.class); @Autowired private OperationLogService operationLogService; // 添加日志的service接口 // 利用SpringAOP的环绕通知 com.java265.controller包下面的所有类所有方法,并且方法上面有@operateLog注解 @Around("execution(*com.java265.controller.*.*(..)) && @annotation(operateLog)") public Object insertLogAround(ProceedingJoinPoint pjp , OperateLog operateLog) throws Throwable{ System.out.println(" ************************ 记录日志 [start] ****************************** "); OperationLog op = new OperationLog(); //记录日志的实体类 DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); op.setOperateTime(sdf.format(new Date())); op.setOperateUser(DataUtils.getRandStr(8)); // 操作人 op.setOperateClass(pjp.getTarget().getClass().getName());// 操作的类 op.setOperateMethod(pjp.getSignature().getName()); // 操作方法 //获取方法调用时传递的参数 Object[] args = pjp.getArgs(); op.setParamAndValue(Arrays.toString(args)); long start_time = System.currentTimeMillis(); //放行 Object object = pjp.proceed(); long end_time = System.currentTimeMillis(); op.setCostTime(end_time - start_time); if(object != null){ op.setReturnClass(object.getClass().getName()); op.setReturnValue(object.toString()); }else{ op.setReturnClass("java.lang.Object"); op.setParamAndValue("void"); } log.error(JsonUtils.obj2JsonString(op)); operationLogService.insert(op);// 插入日志 System.out.println(" ************************** 记录日志 [end] *************************** "); return object; } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。