优化:优化日志表结构(新增 module 所属模块字段);优化日志引擎部分代码;使用 defaultIfNull() 和 blankToDefault 替换部分三元运算符代码(便于阅读及理解);将 BaseEntity 重命名为 BaseDO

This commit is contained in:
2023-01-31 20:29:48 +08:00
parent 1837047a9e
commit 21fe29b56f
22 changed files with 144 additions and 94 deletions

View File

@@ -19,7 +19,7 @@ package top.charles7c.cnadmin.monitor.annotation;
import java.lang.annotation.*;
/**
* 系统日志注解(用于接口方法或类上)
* 系统日志注解(用于接口方法或类上,辅助 Spring Doc OpenAPI3 使用效果最佳
*
* @author Charles7c
* @since 2022/12/23 20:00
@@ -30,12 +30,28 @@ import java.lang.annotation.*;
public @interface Log {
/**
* 日志描述
* 日志描述(仅用于接口方法上)
* <p>
* 读取顺序:(越靠后优先级越高)<br>
* 1、读取对应接口方法上的 @Operation(summary="描述") 内容<br>
* 2、读取对应接口方法上的 @Log("描述") 内容<br>
* </p>
*/
String value() default "";
/**
* 是否忽略日志记录
* 所属模块(用于接口方法或类上)
* <p>
* 读取顺序:(越靠后优先级越高)<br>
* 1、读取对应接口类上的 @Tag(name = "模块") 内容<br>
* 2、读取对应接口类上的 @Log(module = "模块") 内容<br>
* 3、读取对应接口方法上的 @Log(module = "模块") 内容
* </p>
*/
String module() default "";
/**
* 是否忽略日志记录(仅用于接口方法上)
*/
boolean ignore() default false;
}

View File

@@ -26,8 +26,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
@@ -39,6 +39,7 @@ import org.springframework.web.util.WebUtils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.extra.spring.SpringUtil;
@@ -88,8 +89,11 @@ public class LogInterceptor implements HandlerInterceptor {
return;
}
HandlerMethod handlerMethod = (HandlerMethod)handler;
// 记录所属模块
this.logModule(logDO, handlerMethod);
// 记录日志描述
this.logDescription(logDO, handler);
this.logDescription(logDO, handlerMethod);
// 记录请求信息
this.logRequest(logDO, request);
// 记录响应信息
@@ -140,24 +144,51 @@ public class LogInterceptor implements HandlerInterceptor {
return null;
}
/**
* 记录所属模块
*
* @param logDO
* 系统日志信息
* @param handlerMethod
* 处理器方法
*/
private void logModule(LogDO logDO, HandlerMethod handlerMethod) {
Tag classTag = handlerMethod.getBeanType().getDeclaredAnnotation(Tag.class);
Log classLog = handlerMethod.getBeanType().getDeclaredAnnotation(Log.class);
Log methodLog = handlerMethod.getMethodAnnotation(Log.class);
// 例如:@Tag(name = "部门管理") -> 部门管理
// (本框架代码规范)例如:@Tag(name = "部门管理 API") -> 部门管理
if (classTag != null) {
String name = classTag.name();
logDO.setModule(StrUtil.isNotBlank(name) ? name.replace("API", "").trim() : "请在该接口类上指定所属模块");
}
// 例如:@Log(module = "部门管理") -> 部门管理
if (classLog != null && StrUtil.isNotBlank(classLog.module())) {
logDO.setModule(classLog.module());
}
if (methodLog != null && StrUtil.isNotBlank(methodLog.module())) {
logDO.setModule(methodLog.module());
}
}
/**
* 记录日志描述
*
* @param logDO
* 系统日志信息
* @param handler
* 处理器
* @param handlerMethod
* 处理器方法
*/
private void logDescription(LogDO logDO, Object handler) {
HandlerMethod handlerMethod = (HandlerMethod)handler;
Operation methodOperation = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Operation.class);
Log methodLog = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Log.class);
private void logDescription(LogDO logDO, HandlerMethod handlerMethod) {
Operation methodOperation = handlerMethod.getMethodAnnotation(Operation.class);
Log methodLog = handlerMethod.getMethodAnnotation(Log.class);
// 例如:@Operation(summary="新增部门") -> 新增部门
if (methodOperation != null) {
logDO.setDescription(
StrUtil.isNotBlank(methodOperation.summary()) ? methodOperation.summary() : "请在该接口方法上指定日志描述");
logDO.setDescription(StrUtil.blankToDefault(methodOperation.summary(), "请在该接口方法上指定日志描述"));
}
// 例如:@Log("获取验证码") -> 获取验证码
// 例如:@Log("新增部门") -> 新增部门
if (methodLog != null && StrUtil.isNotBlank(methodLog.value())) {
logDO.setDescription(methodLog.value());
}
@@ -184,7 +215,7 @@ public class LogInterceptor implements HandlerInterceptor {
logDO.setClientIp(ServletUtil.getClientIP(request));
logDO.setLocation(IpUtils.getCityInfo(logDO.getClientIp()));
logDO.setBrowser(ServletUtils.getBrowser(request));
logDO.setCreateUser(logDO.getCreateUser() == null ? LoginHelper.getUserId() : logDO.getCreateUser());
logDO.setCreateUser(ObjectUtil.defaultIfNull(logDO.getCreateUser(), LoginHelper.getUserId()));
}
/**
@@ -290,13 +321,13 @@ public class LogInterceptor implements HandlerInterceptor {
// 3、排除不需要记录系统日志的接口
HandlerMethod handlerMethod = (HandlerMethod)handler;
Log methodLog = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Log.class);
// 3.1 请求方式不要求记录且请求上没有 @Log 注解,则不记录系统日志
Log methodLog = handlerMethod.getMethodAnnotation(Log.class);
// 3.1 请求方式不要求记录且接口方法上没有 @Log 注解,则不记录系统日志
if (operationLogProperties.getExcludeMethods().contains(request.getMethod()) && methodLog == null) {
return false;
}
// 3.2 如果接口上既没有 @Log 注解,也没有 @Operation 注解,则不记录系统日志
Operation methodOperation = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Operation.class);
// 3.2 如果接口方法上既没有 @Log 注解,也没有 @Operation 注解,则不记录系统日志
Operation methodOperation = handlerMethod.getMethodAnnotation(Operation.class);
if (methodLog == null && methodOperation == null) {
return false;
}
@@ -304,7 +335,7 @@ public class LogInterceptor implements HandlerInterceptor {
if (methodOperation != null && methodOperation.hidden()) {
return false;
}
// 3.4 如果接口上有 @Log 注解,但是要求忽略该接口,则不记录系统日志
// 3.4 如果接口方法上有 @Log 注解,但是要求忽略该接口,则不记录系统日志
return methodLog == null || !methodLog.ignore();
}
}

View File

@@ -49,6 +49,11 @@ public class LogDO implements Serializable {
*/
private String description;
/**
* 所属模块
*/
private String module;
/**
* 请求URL
*/

View File

@@ -16,6 +16,9 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -29,7 +32,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
* @since 2023/1/17 21:43
*/
@Data
public class LogVO {
public class LogVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 创建人
@@ -42,4 +47,10 @@ public class LogVO {
*/
@Schema(description = "创建人")
private String createUserString;
/**
* 创建时间
*/
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -16,9 +16,6 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -33,7 +30,7 @@ import top.charles7c.cnadmin.monitor.enums.LogStatusEnum;
*/
@Data
@Schema(description = "登录日志信息")
public class LoginLogVO extends LogVO implements Serializable {
public class LoginLogVO extends LogVO {
private static final long serialVersionUID = 1L;
@@ -78,10 +75,4 @@ public class LoginLogVO extends LogVO implements Serializable {
*/
@Schema(description = "错误信息")
private String errorMsg;
/**
* 登录时间
*/
@Schema(description = "登录时间")
private LocalDateTime createTime;
}

View File

@@ -16,9 +16,6 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -33,7 +30,7 @@ import top.charles7c.cnadmin.monitor.enums.LogStatusEnum;
*/
@Data
@Schema(description = "操作日志信息")
public class OperationLogVO extends LogVO implements Serializable {
public class OperationLogVO extends LogVO {
private static final long serialVersionUID = 1L;
@@ -49,6 +46,12 @@ public class OperationLogVO extends LogVO implements Serializable {
@Schema(description = "操作内容")
private String description;
/**
* 所属模块
*/
@Schema(description = "所属模块")
private String module;
/**
* 操作状态1成功 2失败
*/
@@ -78,10 +81,4 @@ public class OperationLogVO extends LogVO implements Serializable {
*/
@Schema(description = "错误信息")
private String errorMsg;
/**
* 操作时间
*/
@Schema(description = "操作时间")
private LocalDateTime createTime;
}

View File

@@ -16,9 +16,6 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -31,7 +28,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
*/
@Data
@Schema(description = "系统日志详情信息")
public class SystemLogDetailVO extends LogVO implements Serializable {
public class SystemLogDetailVO extends LogVO {
private static final long serialVersionUID = 1L;
@@ -112,10 +109,4 @@ public class SystemLogDetailVO extends LogVO implements Serializable {
*/
@Schema(description = "浏览器")
private String browser;
/**
* 创建时间
*/
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -16,9 +16,6 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -31,7 +28,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
*/
@Data
@Schema(description = "系统日志信息")
public class SystemLogVO extends LogVO implements Serializable {
public class SystemLogVO extends LogVO {
private static final long serialVersionUID = 1L;
@@ -100,10 +97,4 @@ public class SystemLogVO extends LogVO implements Serializable {
*/
@Schema(description = "异常详情")
private String exceptionDetail;
/**
* 创建时间
*/
@Schema(description = "创建时间")
private LocalDateTime createTime;
}