java如何使用AOP记录日志呢?

欣喜 Java经验 发布时间:2024-01-19 17:44:12 阅读数:7820 1
下文笔者讲述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;
 }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202401/17056575027713.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者