1. 概述
在一般系统中,当我们做了一些重要的操作时,如登陆系统,添加用户,删除用户等操作时,我们需要将这些行为持久化。本文我们通过Spring AOP和Java的自定义注解来实现日志的插入。此方案对原有业务入侵较低,实现较灵活
2. 日志的相关类定义
我们将日志抽象为以下两个类:功能模块和操作类型 使用枚举类定义功能模块类型ModuleType,如学生、用户模块
public enum ModuleType {
DEFAULT("1"), // 默认值
STUDENT("2"),// 学生模块
TEACHER("3"); // 用户模块
private ModuleType(String index){
this.module = index;
}
private String module;
public String getModule(){
return this.module;
}
}
使用枚举类定义操作的类型:EventType。如登陆、添加、删除、更新、删除等
public enum EventType {
DEFAULT("1", "default"), ADD("2", "add"), UPDATE("3", "update"), DELETE_SINGLE("4", "delete-single"),
LOGIN("10","login"),LOGIN_OUT("11","login_out");
private EventType(String index, String name){
this.name = name;
this.event = index;
}
private String event;
private String name;
public String getEvent(){
return this.event;
}
public String getName() {
return name;
}
}
3. 定义日志相关的注解
3.1. @LogEnable
这里我们定义日志的开关量,类上只有这个值为true,这个类中日志功能才开启
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface LogEnable {
/**
* 如果为true,则类下面的LogEvent启作用,否则忽略
* @return
*/
boolean logEnable() default true;
}
3.2. @LogEvent
这里定义日志的详细内容。如果此注解注解在类上,则这个参数做为类全部方法的默认值。如果注解在方法上,则只对这个方法启作用
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.METHOD, ElementType.TYPE})
public @interface LogEvent {
ModuleType module() default ModuleType.DEFAULT; // 日志所属的模块
EventType event() default EventType.DEFAULT; // 日志事件类型
String desc() default ""; // 描述信息
}
3.3. @LogKey
此注解如果注解在方法上,则整个方法的参数以json的格式保存到日志中。如果此注解同时注解在方法和类上,则方法上的注解会覆盖类上的值。
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogKey {
String keyName() default ""; // key的名称
boolean isUserId() default false; // 此字段是否是本次操作的userId,这里略
boolean isLog() default true; // 是否加入到日志中
}
4. 定义日志处理类
4.1. LogAdmModel
定义保存日志信息的类
public class LogAdmModel {
private Long id;
private String userId; // 操作用户
private String userName;
private String admModel; // 模块
private String admEvent; // 操作
private Date createDate; // 操作内容
private String admOptContent; // 操作内容
private String desc; // 备注
set/get略
}
4.2. ILogManager
定义日志处理的接口类ILogManager 我们可以将日志存入数据库,也可以将日志发送到开中间件,如果redis, mq等等。每一种日志处理类都是此接口的实现类
public interface ILogManager {
/**
* 日志处理模块
* @param paramLogAdmBean
*/
void dealLog(LogAdmModel paramLogAdmBean);
}
4.3. DBLogManager
ILogManager实现类,将日志入库。这里只模拟入库