前言
Spring 封装操作日志记录功能并不复杂,其实现的方案有许多种。有的通过拓展拦截器来进行记录, 有的通过AOP,自定义注解来标记记录。以上方案,个人觉得都不太好。通过拦截器来记录,需要重写HttpReponseWrapper。因为HttpRequest的body和HttpResponse的body都是流,只能单向读取;而通过自定义注解来标记记录,不方便集中管理,还造成冗余注解的情况。
所以针对以上弊点,个人整理另一种基于AOP的方式来进行记录操作日志的方案。这种方案可以做到对controller层的方法零侵入性,以及对需要进行操作日志记录的接口进行集中管理。
代码
- 操作日志实体类
/**
* 系统日志
* @author rocky
* @date 2021/12/18 23:12
*/
@Data
@TableName("sys_log")
@EqualsAndHashCode(callSuper = false)
public class SysLog extends BaseNoRecorderModel {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 标题 */
private String title;
/** 模块 */
private String module;
/** 内容 */
private String content;
/** api */
private String api;
/** 请求内容 */
private String request;
/** 响应内容 */
private String response;
/** 操作人 */
private String operator;
/** 请求IP */
private String requestIp;
}
- 操作日志DTO
/**
* 操作日志DTO
* 主要为了读取操作日志拦截配置
* @author rocky
* @date 2021/12/18 23:19
*/
@Data
@XStreamAlias("log")
public class LogDTO {
@XStreamImplicit(itemFieldName = "logModule")
private List<LogModule> logModules = new ArrayList<>();
@Data
@XStreamAlias("logModule")
public static class LogModule implements Serializable {
@XStreamAsAttribute
private String path;
@XStreamAsAttribute
private String module;
@XStreamImplicit(itemFieldName = "logPath")
private List<LogPath> logPaths = new ArrayList<>();
}
@Data
@XStreamAlias("logPath")
@XStreamConverter(value= ToAttributedValueConverter.class, strings={
"path"})
public static class LogPath implements Serializable