添加操作日志服务.
This commit is contained in:
@@ -41,6 +41,8 @@ public interface AutoConfigureOrderConst {
|
|||||||
|
|
||||||
int FRAMEWORK_MONITOR = Integer.MIN_VALUE + 2200;
|
int FRAMEWORK_MONITOR = Integer.MIN_VALUE + 2200;
|
||||||
|
|
||||||
int FRAMEWORK_BANNER = Integer.MIN_VALUE + 2300;
|
int FRAMEWORK_BIZ_OPERATOR_LOG = Integer.MIN_VALUE + 3000;
|
||||||
|
|
||||||
|
int FRAMEWORK_BANNER = Integer.MIN_VALUE + 10000;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,20 @@ import com.orion.ext.location.Region;
|
|||||||
import com.orion.ext.location.region.LocationRegions;
|
import com.orion.ext.location.region.LocationRegions;
|
||||||
import com.orion.ops.framework.common.constant.Const;
|
import com.orion.ops.framework.common.constant.Const;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* ip 工具类
|
||||||
|
*
|
||||||
* @author Jiahang Li
|
* @author Jiahang Li
|
||||||
* @version 1.0.0
|
* @version 1.0.0
|
||||||
* @since 2023/7/14 16:26
|
* @since 2023/7/14 16:26
|
||||||
*/
|
*/
|
||||||
public class IpUtils {
|
public class IpUtils {
|
||||||
|
|
||||||
|
private static final Map<String, String> CACHE = new HashMap<>();
|
||||||
|
|
||||||
private IpUtils() {
|
private IpUtils() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,6 +28,20 @@ public class IpUtils {
|
|||||||
* @return ip 位置
|
* @return ip 位置
|
||||||
*/
|
*/
|
||||||
public static String getLocation(String ip) {
|
public static String getLocation(String ip) {
|
||||||
|
if (ip == null) {
|
||||||
|
return Const.UNKNOWN;
|
||||||
|
}
|
||||||
|
// 查询缓存
|
||||||
|
return CACHE.computeIfAbsent(ip, IpUtils::queryLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询 ip 位置
|
||||||
|
*
|
||||||
|
* @param ip ip
|
||||||
|
* @return ip 位置
|
||||||
|
*/
|
||||||
|
private static String queryLocation(String ip) {
|
||||||
if (ip == null) {
|
if (ip == null) {
|
||||||
return Const.UNKNOWN;
|
return Const.UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.config;
|
||||||
|
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.aspect.OperatorLogAspect;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.config.OperatorLogConfig;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkService;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkServiceDelegate;
|
||||||
|
import com.orion.ops.framework.common.constant.AutoConfigureOrderConst;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Primary;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志配置类
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 16:42
|
||||||
|
*/
|
||||||
|
@AutoConfiguration
|
||||||
|
@AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_BIZ_OPERATOR_LOG)
|
||||||
|
@EnableConfigurationProperties(OperatorLogConfig.class)
|
||||||
|
public class OrionOperatorLogAutoConfiguration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志委托类
|
||||||
|
*
|
||||||
|
* @param service service
|
||||||
|
* @return delegate
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
@Primary
|
||||||
|
@ConditionalOnBean(OperatorLogFrameworkService.class)
|
||||||
|
public OperatorLogFrameworkServiceDelegate operatorLogFrameworkService(OperatorLogFrameworkService service) {
|
||||||
|
return new OperatorLogFrameworkServiceDelegate(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志切面
|
||||||
|
*
|
||||||
|
* @param operatorLogConfig operatorLogConfig
|
||||||
|
* @param service service
|
||||||
|
* @return aspect
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnBean(OperatorLogFrameworkServiceDelegate.class)
|
||||||
|
public OperatorLogAspect operatorLogAspect(OperatorLogConfig operatorLogConfig,
|
||||||
|
OperatorLogFrameworkService service) {
|
||||||
|
return new OperatorLogAspect(operatorLogConfig, service);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,9 +1,29 @@
|
|||||||
package com.orion.ops.framework.biz.operator.log.core.annotation;
|
package com.orion.ops.framework.biz.operator.log.core.annotation;
|
||||||
|
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.enums.ReturnType;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 操作日志
|
||||||
|
*
|
||||||
* @author Jiahang Li
|
* @author Jiahang Li
|
||||||
* @version 1.0.0
|
* @version 1.0.0
|
||||||
* @since 2023/10/9 18:44
|
* @since 2023/10/9 18:44
|
||||||
*/
|
*/
|
||||||
public interface OperatorLog {
|
@Target({ElementType.METHOD})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Documented
|
||||||
|
public @interface OperatorLog {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作类型
|
||||||
|
*/
|
||||||
|
String value();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回值处理
|
||||||
|
*/
|
||||||
|
ReturnType ret() default ReturnType.JSON;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,220 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.aspect;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.serializer.ValueFilter;
|
||||||
|
import com.orion.lang.define.thread.ExecutorBuilder;
|
||||||
|
import com.orion.lang.define.wrapper.Ref;
|
||||||
|
import com.orion.lang.utils.Strings;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.annotation.OperatorLog;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.config.OperatorLogConfig;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.enums.ReturnType;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.holder.OperatorTypeHolder;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.model.OperatorLogModel;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.model.OperatorType;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkService;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs;
|
||||||
|
import com.orion.ops.framework.common.enums.BooleanBit;
|
||||||
|
import com.orion.ops.framework.common.meta.TraceIdHolder;
|
||||||
|
import com.orion.ops.framework.common.security.SecurityHolder;
|
||||||
|
import com.orion.ops.framework.common.utils.IpUtils;
|
||||||
|
import com.orion.web.servlet.web.Servlets;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志切面
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 10:47
|
||||||
|
*/
|
||||||
|
@Aspect
|
||||||
|
@Slf4j
|
||||||
|
public class OperatorLogAspect {
|
||||||
|
|
||||||
|
private static final ExecutorService LOG_SAVER = ExecutorBuilder.create()
|
||||||
|
.corePoolSize(1)
|
||||||
|
.maxPoolSize(1)
|
||||||
|
.useLinkedBlockingQueue()
|
||||||
|
.allowCoreThreadTimeout()
|
||||||
|
.useLinkedBlockingQueue()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private final OperatorLogConfig operatorLogConfig;
|
||||||
|
|
||||||
|
private final OperatorLogFrameworkService operatorLogFrameworkService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ValueFilter desensitizeValueFilter;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SecurityHolder securityHolder;
|
||||||
|
|
||||||
|
public OperatorLogAspect(OperatorLogConfig operatorLogConfig,
|
||||||
|
OperatorLogFrameworkService operatorLogFrameworkService) {
|
||||||
|
this.operatorLogConfig = operatorLogConfig;
|
||||||
|
this.operatorLogFrameworkService = operatorLogFrameworkService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("@annotation(o)")
|
||||||
|
public Object around(ProceedingJoinPoint joinPoint, OperatorLog o) throws Throwable {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
try {
|
||||||
|
// 执行
|
||||||
|
Object result = joinPoint.proceed();
|
||||||
|
// 记录日志
|
||||||
|
this.saveLog(start, o, result, null);
|
||||||
|
return result;
|
||||||
|
} catch (Throwable exception) {
|
||||||
|
// 记录日志
|
||||||
|
this.saveLog(start, o, null, exception);
|
||||||
|
throw exception;
|
||||||
|
} finally {
|
||||||
|
// 清空上下文
|
||||||
|
OperatorLogs.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存日志
|
||||||
|
*
|
||||||
|
* @param start start
|
||||||
|
* @param exception exception
|
||||||
|
*/
|
||||||
|
private void saveLog(long start, OperatorLog o, Object ret, Throwable exception) {
|
||||||
|
// 请求信息
|
||||||
|
Map<String, Object> extra = OperatorLogs.get();
|
||||||
|
if (!OperatorLogs.isSave(extra)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
OperatorLogModel model = new OperatorLogModel();
|
||||||
|
// 填充使用时间
|
||||||
|
this.fillUseTime(model, start);
|
||||||
|
// 填充用户信息
|
||||||
|
this.fillUserInfo(model);
|
||||||
|
// 填充请求信息
|
||||||
|
this.fillRequest(model);
|
||||||
|
// 填充结果信息
|
||||||
|
this.fillResult(model, o, ret, exception);
|
||||||
|
// 填充拓展信息
|
||||||
|
this.fillExtra(model, extra);
|
||||||
|
// 填充日志
|
||||||
|
this.fillLogInfo(model, extra, o);
|
||||||
|
// 插入日志
|
||||||
|
this.asyncSaveLog(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充使用时间
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
* @param start start
|
||||||
|
*/
|
||||||
|
private void fillUseTime(OperatorLogModel model, long start) {
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
model.setDuration((int) (end - start));
|
||||||
|
model.setStartTime(new Date(start));
|
||||||
|
model.setEndTime(new Date(end));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充用户信息
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
*/
|
||||||
|
private void fillUserInfo(OperatorLogModel model) {
|
||||||
|
model.setUserId(securityHolder.getLoginUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充请求信息
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
*/
|
||||||
|
private void fillRequest(OperatorLogModel model) {
|
||||||
|
model.setTraceId(TraceIdHolder.get());
|
||||||
|
Optional.ofNullable(RequestContextHolder.getRequestAttributes())
|
||||||
|
.map(s -> (ServletRequestAttributes) s)
|
||||||
|
.map(ServletRequestAttributes::getRequest)
|
||||||
|
.ifPresent(request -> {
|
||||||
|
String address = Servlets.getRemoteAddr(request);
|
||||||
|
model.setAddress(address);
|
||||||
|
model.setLocation(IpUtils.getLocation(address));
|
||||||
|
model.setUserAgent(Servlets.getUserAgent(request));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充结果
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
* @param exception exception
|
||||||
|
*/
|
||||||
|
private void fillResult(OperatorLogModel model, OperatorLog o, Object ret, Throwable exception) {
|
||||||
|
if (exception == null) {
|
||||||
|
model.setResult(BooleanBit.TRUE.getValue());
|
||||||
|
ReturnType retType = o.ret();
|
||||||
|
if (ret != null) {
|
||||||
|
if (ReturnType.JSON.equals(retType)) {
|
||||||
|
// 脱敏
|
||||||
|
model.setReturnValue(JSON.toJSONString(ret, desensitizeValueFilter));
|
||||||
|
} else if (ReturnType.TO_STRING.equals(retType)) {
|
||||||
|
model.setReturnValue(JSON.toJSONString(Ref.of(Objects.toString(ret))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
model.setResult(BooleanBit.FALSE.getValue());
|
||||||
|
// 错误信息
|
||||||
|
String errorMessage = Strings.retain(exception.getMessage(), operatorLogConfig.getErrorMessageLength());
|
||||||
|
model.setErrorMessage(errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充拓展信息
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
* @param extra extra
|
||||||
|
*/
|
||||||
|
private void fillExtra(OperatorLogModel model, Map<String, Object> extra) {
|
||||||
|
// 脱敏
|
||||||
|
model.setExtra(JSON.toJSONString(extra, desensitizeValueFilter));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充日志信息
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
* @param extra extra
|
||||||
|
* @param o o
|
||||||
|
*/
|
||||||
|
private void fillLogInfo(OperatorLogModel model, Map<String, Object> extra, OperatorLog o) {
|
||||||
|
OperatorType type = OperatorTypeHolder.get(o.value());
|
||||||
|
model.setModule(type.getModule());
|
||||||
|
model.setType(type.getType());
|
||||||
|
model.setLogInfo(Strings.format(type.getTemplate(), extra));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步保存日志
|
||||||
|
*
|
||||||
|
* @param model model
|
||||||
|
*/
|
||||||
|
private void asyncSaveLog(OperatorLogModel model) {
|
||||||
|
LOG_SAVER.submit(() -> {
|
||||||
|
operatorLogFrameworkService.insert(model);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志配置
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 14:08
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ConfigurationProperties("orion.operator-log")
|
||||||
|
public class OperatorLogConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息长度
|
||||||
|
*/
|
||||||
|
private Integer errorMessageLength;
|
||||||
|
|
||||||
|
public OperatorLogConfig() {
|
||||||
|
this.errorMessageLength = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回值类型
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 15:55
|
||||||
|
*/
|
||||||
|
public enum ReturnType {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 忽略
|
||||||
|
*/
|
||||||
|
IGNORE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* json
|
||||||
|
*/
|
||||||
|
JSON,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* string
|
||||||
|
*/
|
||||||
|
TO_STRING,
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.holder;
|
||||||
|
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.model.OperatorType;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志类型实例
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 14:43
|
||||||
|
*/
|
||||||
|
public class OperatorTypeHolder {
|
||||||
|
|
||||||
|
private static final Map<String, OperatorType> TYPES = new HashMap<>();
|
||||||
|
|
||||||
|
private OperatorTypeHolder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类型
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
public static OperatorType get(String key) {
|
||||||
|
return TYPES.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置类型
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @param type type
|
||||||
|
*/
|
||||||
|
public static void set(String key, OperatorType type) {
|
||||||
|
TYPES.put(key, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,8 @@ package com.orion.ops.framework.biz.operator.log.core.model;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志模型
|
* 操作日志模型
|
||||||
*
|
*
|
||||||
@@ -11,17 +13,80 @@ import lombok.Data;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class OperatorLogModel {
|
public class OperatorLogModel {
|
||||||
// 用户操作日志
|
|
||||||
// id
|
/**
|
||||||
// user_id
|
* userId
|
||||||
// trace_id
|
*/
|
||||||
// log_info
|
private Long userId;
|
||||||
// module 模块
|
|
||||||
// operator 操作
|
/**
|
||||||
// ip
|
* traceId
|
||||||
// address
|
*/
|
||||||
// user_agent
|
private String traceId;
|
||||||
// params
|
|
||||||
// result
|
/**
|
||||||
// duration
|
* 请求 ip
|
||||||
|
*/
|
||||||
|
private String address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求地址
|
||||||
|
*/
|
||||||
|
private String location;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* user-agent
|
||||||
|
*/
|
||||||
|
private String userAgent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志
|
||||||
|
*/
|
||||||
|
private String logInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块
|
||||||
|
*/
|
||||||
|
private String module;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作类型
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数
|
||||||
|
*/
|
||||||
|
private String extra;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作结果 0失败 1成功
|
||||||
|
*/
|
||||||
|
private Integer result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
private String errorMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回值
|
||||||
|
*/
|
||||||
|
private String returnValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作时间
|
||||||
|
*/
|
||||||
|
private Integer duration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始时间
|
||||||
|
*/
|
||||||
|
private Date startTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束时间
|
||||||
|
*/
|
||||||
|
private Date endTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作类型定义
|
||||||
|
* <p>
|
||||||
|
* 因为枚举需要实现 注解中不可以使用 则需要使用对象
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 10:29
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class OperatorType {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块
|
||||||
|
*/
|
||||||
|
private final String module;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类型
|
||||||
|
*/
|
||||||
|
private final String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模板
|
||||||
|
*/
|
||||||
|
private final String template;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.service;
|
||||||
|
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.model.OperatorLogModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志框架服务
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 11:26
|
||||||
|
*/
|
||||||
|
public interface OperatorLogFrameworkService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录日志
|
||||||
|
*
|
||||||
|
* @param log log
|
||||||
|
*/
|
||||||
|
void insert(OperatorLogModel log);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.service;
|
||||||
|
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.model.OperatorLogModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志框架服务 委托类
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 14:11
|
||||||
|
*/
|
||||||
|
public class OperatorLogFrameworkServiceDelegate implements OperatorLogFrameworkService {
|
||||||
|
|
||||||
|
private final OperatorLogFrameworkService operatorLogFrameworkService;
|
||||||
|
|
||||||
|
public OperatorLogFrameworkServiceDelegate(OperatorLogFrameworkService operatorLogFrameworkService) {
|
||||||
|
this.operatorLogFrameworkService = operatorLogFrameworkService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void insert(OperatorLogModel log) {
|
||||||
|
operatorLogFrameworkService.insert(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
package com.orion.ops.framework.biz.operator.log.core.uitls;
|
||||||
|
|
||||||
|
import com.orion.lang.utils.reflect.BeanMap;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志工具类
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 11:32
|
||||||
|
*/
|
||||||
|
public class OperatorLogs {
|
||||||
|
|
||||||
|
private static final String UN_SAVE_FLAG = "__un__save__";
|
||||||
|
|
||||||
|
private static final ThreadLocal<Map<String, Object>> EXTRA_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
|
private OperatorLogs() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加参数
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @param value value
|
||||||
|
*/
|
||||||
|
public static void add(String key, Object value) {
|
||||||
|
initMap().put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加参数
|
||||||
|
*
|
||||||
|
* @param map map
|
||||||
|
*/
|
||||||
|
public static void add(Map<String, ?> map) {
|
||||||
|
initMap().putAll(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加参数
|
||||||
|
*
|
||||||
|
* @param obj obj
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static void add(Object obj) {
|
||||||
|
if (obj == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (obj instanceof Map) {
|
||||||
|
add((Map<String, ?>) obj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
initMap().putAll(BeanMap.create(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置不保存
|
||||||
|
*/
|
||||||
|
public static void unSave() {
|
||||||
|
setSave(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置是否保存
|
||||||
|
*
|
||||||
|
* @param save save
|
||||||
|
*/
|
||||||
|
public static void setSave(boolean save) {
|
||||||
|
if (!save) {
|
||||||
|
initMap().put(UN_SAVE_FLAG, UN_SAVE_FLAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取参数
|
||||||
|
*
|
||||||
|
* @return map
|
||||||
|
*/
|
||||||
|
public static Map<String, Object> get() {
|
||||||
|
return EXTRA_HOLDER.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清空
|
||||||
|
*/
|
||||||
|
public static void clear() {
|
||||||
|
EXTRA_HOLDER.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否保存
|
||||||
|
*
|
||||||
|
* @param map map
|
||||||
|
* @return save
|
||||||
|
*/
|
||||||
|
public static boolean isSave(Map<String, Object> map) {
|
||||||
|
return map == null || !map.containsKey(UN_SAVE_FLAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化
|
||||||
|
*
|
||||||
|
* @return map
|
||||||
|
*/
|
||||||
|
private static Map<String, Object> initMap() {
|
||||||
|
Map<String, Object> map = EXTRA_HOLDER.get();
|
||||||
|
if (map == null) {
|
||||||
|
map = new HashMap<>();
|
||||||
|
EXTRA_HOLDER.set(map);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "orion.operator-log",
|
||||||
|
"type": "com.orion.ops.framework.biz.operator.log.core.config.OperatorLogConfig",
|
||||||
|
"sourceType": "com.orion.ops.framework.biz.operator.log.core.config.OperatorLogConfig"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"name": "orion.operator-log.error-message-length",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"description": "日志打印模型.",
|
||||||
|
"defaultValue": "255"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
com.orion.ops.framework.biz.operator.log.config.OrionOperatorLogAutoConfiguration
|
||||||
@@ -16,6 +16,8 @@ import com.orion.ops.framework.log.core.annotation.IgnoreLog;
|
|||||||
import com.orion.ops.framework.log.core.config.LogPrinterConfig;
|
import com.orion.ops.framework.log.core.config.LogPrinterConfig;
|
||||||
import com.orion.ops.framework.log.core.enums.IgnoreLogMode;
|
import com.orion.ops.framework.log.core.enums.IgnoreLogMode;
|
||||||
import org.aopalliance.intercept.MethodInvocation;
|
import org.aopalliance.intercept.MethodInvocation;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
@@ -253,7 +255,10 @@ public abstract class AbstractLogPrinterInterceptor implements LogPrinterInterce
|
|||||||
}
|
}
|
||||||
Object arg = args[i];
|
Object arg = args[i];
|
||||||
// 是否为 request / response
|
// 是否为 request / response
|
||||||
if (arg instanceof ServletRequest || arg instanceof ServletResponse) {
|
if (arg instanceof ServletRequest ||
|
||||||
|
arg instanceof ServletResponse ||
|
||||||
|
arg instanceof MultipartFile ||
|
||||||
|
arg instanceof BindingResult) {
|
||||||
ignored[i] = true;
|
ignored[i] = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -196,3 +196,5 @@ orion:
|
|||||||
max-pool-size: 4
|
max-pool-size: 4
|
||||||
queue-capacity: 30
|
queue-capacity: 30
|
||||||
keep-alive-seconds: 180
|
keep-alive-seconds: 180
|
||||||
|
operator-log:
|
||||||
|
error-message-length: 255
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.orion.ops.module.infra.framework.service.impl;
|
||||||
|
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.model.OperatorLogModel;
|
||||||
|
import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作日志包 实现类
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/10/10 16:53
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class OperatorLogFrameworkServiceImpl implements OperatorLogFrameworkService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void insert(OperatorLogModel log) {
|
||||||
|
System.out.println(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user