在后台管理系统中,日志是不可或缺的,通常,在开发的时候我们会设置日志级别为debug或info,上线后再设置为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

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





