AOP+注解+SpringEL表达式记录操作日志

本文介绍了后台管理系统中操作日志的记录方法,包括直接调用日志方法、使用注解加切面方式,并重点讲解了如何利用SpringEL表达式增强日志记录功能。

在后台管理系统中,日志是不可或缺的,通常,在开发的时候我们会设置日志级别为debuginfo,上线后再设置为error,这些系统日志在帮助我们排查系统问题时作用非常大。但还有一类日志也是非常重要的,那就是操作日志,也就是记录用户在某个时间点干了什么事的日志。这篇文章就简单聊聊如何更好的记录操作日志。

在参与过不少项目的开发后,大概总结出了下面这么几种记录日志的方式。

第一种就是直接调用日志方法,类似下面这种,这类代码在以前的老系统中非常常见,好处是代码清晰,但太冗余了,总不可能每次要记录日志都复制一遍,如果不需要记录日志了,那又得挨个删除,特别麻烦。

void doSomething() {
   
   
    String userName = WebUtil.getUserName();
    logService.saveLog(userName, "${userName} did something at ${date}...");
}

第二种就是目前非常流行的注解加切面的方式,也是今天要介绍的。但我发现,在不少项目中,日志的功能都比较单一,记录的结果大都是“[xxx]执行了[xxx]操作”之类的,但在执行这个操作的时候,参数以及目标数据的信息等,日志中是看不出来的,这时候可能又会怀念上面的第一种方式,但实则大可不必。

用过spring缓存的应该都记得spring缓存中的非常常用的几个注解,如@Cacheable@Cacheput等,在使用这些注解的时候,我们都会活用SpringEL表达式来操作缓存,如下面的代码,通过key = #id来动态设置key的值

@Cacheable(value = "user", key = "#id")
public UserInfo getById(Long id) {
   
   
    return userMapper.selectById(id);
}

那么在日志记录的时候,我们也可以模仿spring缓存,让日志注解支持SpringEL表达式,如此一来就可以非常方便的记录我们需要的日志了。

首先,新建日志注解LogRecord,代码如下

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface LogRecord {
   
   
    /**
     * 日志内容,支持SpEL表达式
     */
    String content();
    /**
     * 业务标识,支持SpEL表达式
     */
    String bizNo();
    /**
     * 类别
     */
    String category() default "";
    /**
     * 日志记录条件,支持SpEL表达式
     */
    String condition() default "true";
    /**
     * 是否保存入参
     */
    String saveParams() default "true";
}

然后是最重要的切面

@RequiredArgsConstructor
@Aspect
@Component
public class LogRecordAspect {
   
   

    private final 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值