mirror of https://gitee.com/stylefeng/roses
【8.0】【log】初始化业务日志记录
parent
cf616aee24
commit
bddd8fa405
|
@ -0,0 +1,48 @@
|
|||
|
||||
/*
|
||||
* Copyright [2020-2030] [https://www.stylefeng.cn]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
||||
*
|
||||
* 1.请不要删除和修改根目录下的LICENSE文件。
|
||||
* 2.请不要删除和修改Guns源码头部的版权声明。
|
||||
* 3.请保留源码和相关描述文件的项目出处,作者声明等。
|
||||
* 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
||||
*/
|
||||
package cn.stylefeng.roses.kernel.rule.annotation;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* 用来标记在方法上,进行开启业务日志记录
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 15:37
|
||||
*/
|
||||
@Target({ElementType.METHOD, ElementType.TYPE})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface BizLog {
|
||||
|
||||
/**
|
||||
* 日志记录类型的编码
|
||||
*/
|
||||
String logTypeCode() default StrUtil.EMPTY;
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright [2020-2030] [https://www.stylefeng.cn]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
||||
*
|
||||
* 1.请不要删除和修改根目录下的LICENSE文件。
|
||||
* 2.请不要删除和修改Guns源码头部的版权声明。
|
||||
* 3.请保留源码和相关描述文件的项目出处,作者声明等。
|
||||
* 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
||||
*/
|
||||
package cn.stylefeng.roses.kernel.log.api;
|
||||
|
||||
/**
|
||||
* 业务日志service
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 15:42
|
||||
*/
|
||||
public interface BizLogServiceApi {
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -37,6 +37,11 @@ public interface LogFileConstants {
|
|||
*/
|
||||
Integer DEFAULT_API_LOG_AOP_SORT = 500;
|
||||
|
||||
/**
|
||||
* 默认业务日志记录的aop的顺序
|
||||
*/
|
||||
Integer DEFAULT_BUSINESS_LOG_AOP_SORT = 400;
|
||||
|
||||
/**
|
||||
* 默认全局记录日志的开关
|
||||
*/
|
||||
|
|
|
@ -40,6 +40,13 @@
|
|||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--数据库操作-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>db-sdk-mp</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- web -->
|
||||
<!-- 用于本模块中对controller的拦截器 -->
|
||||
<dependency>
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* Copyright [2020-2030] [https://www.stylefeng.cn]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
||||
*
|
||||
* 1.请不要删除和修改根目录下的LICENSE文件。
|
||||
* 2.请不要删除和修改Guns源码头部的版权声明。
|
||||
* 3.请保留源码和相关描述文件的项目出处,作者声明等。
|
||||
* 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
||||
*/
|
||||
package cn.stylefeng.roses.kernel.log.business.aop;
|
||||
|
||||
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||
import cn.stylefeng.roses.kernel.log.api.constants.LogFileConstants;
|
||||
import cn.stylefeng.roses.kernel.log.business.context.BusinessLogHolder;
|
||||
import cn.stylefeng.roses.kernel.log.business.entity.SysLogBusiness;
|
||||
import cn.stylefeng.roses.kernel.log.business.service.SysLogBusinessService;
|
||||
import cn.stylefeng.roses.kernel.rule.annotation.BizLog;
|
||||
import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
|
||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.springframework.core.Ordered;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 业务日志的AOP
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 15:06
|
||||
*/
|
||||
@Aspect
|
||||
@Slf4j
|
||||
public class BusinessLogRecordAop implements Ordered {
|
||||
|
||||
@Resource
|
||||
private SysLogBusinessService sysLogBusinessService;
|
||||
|
||||
/**
|
||||
* 切面为切BizLog注解
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 15:49
|
||||
*/
|
||||
@Pointcut(value = "@annotation(cn.stylefeng.roses.kernel.rule.annotation.BizLog)")
|
||||
public void cutService() {
|
||||
}
|
||||
|
||||
@Around("cutService()")
|
||||
public Object aroundPost(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||
|
||||
try {
|
||||
|
||||
// 初始化日志的环境信息
|
||||
initBusinessContext(joinPoint);
|
||||
|
||||
// 执行真正业务逻辑,这期间会调用BusinessLogHolder类进行业务日志存储
|
||||
Object result = joinPoint.proceed();
|
||||
|
||||
// 业务日志进行保存
|
||||
SysLogBusiness logContext = BusinessLogHolder.getContext();
|
||||
List<String> contentList = BusinessLogHolder.getContent();
|
||||
sysLogBusinessService.saveBatchLogs(logContext, contentList);
|
||||
|
||||
return result;
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
log.error("业务日志过程中出现异常!", e);
|
||||
|
||||
// 这里不拦截异常,给上级处理异常
|
||||
throw e;
|
||||
|
||||
} finally {
|
||||
// 清除所有日志缓存记录
|
||||
BusinessLogHolder.clearContext();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化业务日志的环境
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 15:55
|
||||
*/
|
||||
private void initBusinessContext(ProceedingJoinPoint joinPoint) {
|
||||
|
||||
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
|
||||
Method method = methodSignature.getMethod();
|
||||
BizLog bizLog = method.getAnnotation(BizLog.class);
|
||||
|
||||
SysLogBusiness sysLogBusiness = new SysLogBusiness();
|
||||
|
||||
// 设置业务日志的类型编码
|
||||
sysLogBusiness.setLogTypeCode(bizLog.logTypeCode());
|
||||
|
||||
// 设置调用链id
|
||||
sysLogBusiness.setTraceId(IdWorker.getId());
|
||||
|
||||
// 设置请求的URL
|
||||
String servletPath = HttpServletUtil.getRequest().getServletPath();
|
||||
sysLogBusiness.setRequestUrl(servletPath);
|
||||
|
||||
// 设置HTTP请求方式
|
||||
sysLogBusiness.setHttpMethod(HttpServletUtil.getRequest().getMethod());
|
||||
|
||||
// 设置客户端IP
|
||||
String requestClientIp = HttpServletUtil.getRequestClientIp(HttpServletUtil.getRequest());
|
||||
sysLogBusiness.setClientIp(requestClientIp);
|
||||
|
||||
// 设置当前登录用户id
|
||||
LoginUser loginUserNullable = LoginContext.me().getLoginUserNullable();
|
||||
if (loginUserNullable != null) {
|
||||
sysLogBusiness.setUserId(loginUserNullable.getUserId());
|
||||
}
|
||||
|
||||
// 添加到线程环境变量
|
||||
BusinessLogHolder.setContext(sysLogBusiness);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return LogFileConstants.DEFAULT_BUSINESS_LOG_AOP_SORT;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.context;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.log.business.entity.SysLogBusiness;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 业务日志暂存
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 16:06
|
||||
*/
|
||||
public class BusinessLogHolder {
|
||||
|
||||
/**
|
||||
* 暂存当前请求的日志信息
|
||||
*/
|
||||
private static final ThreadLocal<SysLogBusiness> BUSINESS_LOG_CONTEXT = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 暂存本次请求的所有日志详情
|
||||
*/
|
||||
private static final ThreadLocal<List<String>> CONTENT_LIST = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 本次业务日志记录上下文信息存储到日志中
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 16:23
|
||||
*/
|
||||
public static void setContext(SysLogBusiness sysLogBusiness) {
|
||||
BUSINESS_LOG_CONTEXT.set(sysLogBusiness);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取本次业务日志记录上下文信息
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2021/3/23 17:41
|
||||
*/
|
||||
public static SysLogBusiness getContext() {
|
||||
return BUSINESS_LOG_CONTEXT.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除所有的日志记录上下文
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2021/3/23 17:42
|
||||
*/
|
||||
public static void clearContext() {
|
||||
BUSINESS_LOG_CONTEXT.remove();
|
||||
CONTENT_LIST.remove();
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加日志记录
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 16:53
|
||||
*/
|
||||
public static void addContent(String contentStr) {
|
||||
List<String> contentList = CONTENT_LIST.get();
|
||||
if (ObjectUtil.isEmpty(contentList)) {
|
||||
contentList = new LinkedList<>();
|
||||
}
|
||||
contentList.add(contentStr);
|
||||
CONTENT_LIST.set(contentList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有的日志详情记录
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 16:53
|
||||
*/
|
||||
public static List<String> getContent() {
|
||||
return CONTENT_LIST.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置日志的摘要信息,便于后台搜索
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 17:30
|
||||
*/
|
||||
public static void setLogTitle(String logTitle) {
|
||||
SysLogBusiness sysLogBusiness = BUSINESS_LOG_CONTEXT.get();
|
||||
if (sysLogBusiness == null) {
|
||||
return;
|
||||
}
|
||||
sysLogBusiness.setLogTitle(logTitle);
|
||||
BUSINESS_LOG_CONTEXT.set(sysLogBusiness);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.controller;
|
||||
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.business.entity.SysLogBusiness;
|
||||
import cn.stylefeng.roses.kernel.log.business.pojo.request.SysLogBusinessRequest;
|
||||
import cn.stylefeng.roses.kernel.log.business.service.SysLogBusinessService;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 业务日志记录控制器
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
@RestController
|
||||
@ApiResource(name = "业务日志记录")
|
||||
public class SysLogBusinessController {
|
||||
|
||||
@Resource
|
||||
private SysLogBusinessService sysLogBusinessService;
|
||||
|
||||
/**
|
||||
* 查询业务日志列表(带分页)
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
@GetResource(name = "查询业务日志列表(带分页)", path = "/sysLogBusiness/page")
|
||||
public ResponseData<PageResult<SysLogBusiness>> page(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
return new SuccessResponseData<>(sysLogBusinessService.findPage(sysLogBusinessRequest));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.entity;
|
||||
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
|
||||
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 业务日志记录实例类
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
@TableName("sys_log_business")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class SysLogBusiness extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@TableId(value = "business_log_id", type = IdType.ASSIGN_ID)
|
||||
@ChineseDescription("主键")
|
||||
private Long businessLogId;
|
||||
|
||||
/**
|
||||
* 日志的业务分类的编码
|
||||
*/
|
||||
@TableField("log_type_code")
|
||||
@ChineseDescription("日志的业务分类的编码")
|
||||
private String logTypeCode;
|
||||
|
||||
/**
|
||||
* 日志的标题,摘要信息
|
||||
*/
|
||||
@TableField("log_title")
|
||||
@ChineseDescription("日志的标题,摘要信息")
|
||||
private String logTitle;
|
||||
|
||||
/**
|
||||
* 日志记录的内容
|
||||
*/
|
||||
@TableField("log_content")
|
||||
@ChineseDescription("日志记录的内容")
|
||||
private String logContent;
|
||||
|
||||
/**
|
||||
* 调用链唯一id,一个id代表一次接口调用
|
||||
*/
|
||||
@TableField("trace_id")
|
||||
@ChineseDescription("调用链唯一id,一个id代表一次接口调用")
|
||||
private Long traceId;
|
||||
|
||||
/**
|
||||
* 当前用户请求的url
|
||||
*/
|
||||
@TableField("request_url")
|
||||
@ChineseDescription("当前用户请求的url")
|
||||
private String requestUrl;
|
||||
|
||||
/**
|
||||
* 请求http方法
|
||||
*/
|
||||
@TableField("http_method")
|
||||
@ChineseDescription("请求http方法")
|
||||
private String httpMethod;
|
||||
|
||||
/**
|
||||
* 客户端的ip
|
||||
*/
|
||||
@TableField("client_ip")
|
||||
@ChineseDescription("客户端的ip")
|
||||
private String clientIp;
|
||||
|
||||
/**
|
||||
* 业务操作的用户id
|
||||
*/
|
||||
@TableField("user_id")
|
||||
@ChineseDescription("业务操作的用户id")
|
||||
private Long userId;
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.enums;
|
||||
|
||||
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
|
||||
import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 业务日志记录异常相关枚举
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
@Getter
|
||||
public enum SysLogBusinessExceptionEnum implements AbstractExceptionEnum {
|
||||
|
||||
/**
|
||||
* 查询结果不存在
|
||||
*/
|
||||
SYS_LOG_BUSINESS_NOT_EXISTED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "查询结果不存在");
|
||||
|
||||
/**
|
||||
* 错误编码
|
||||
*/
|
||||
private final String errorCode;
|
||||
|
||||
/**
|
||||
* 提示用户信息
|
||||
*/
|
||||
private final String userTip;
|
||||
|
||||
SysLogBusinessExceptionEnum(String errorCode, String userTip) {
|
||||
this.errorCode = errorCode;
|
||||
this.userTip = userTip;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.mapper;
|
||||
|
||||
import cn.stylefeng.roses.kernel.db.mp.injector.CustomBaseMapper;
|
||||
import cn.stylefeng.roses.kernel.log.business.entity.SysLogBusiness;
|
||||
|
||||
/**
|
||||
* 业务日志记录 Mapper 接口
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
public interface SysLogBusinessMapper extends CustomBaseMapper<SysLogBusiness> {
|
||||
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.stylefeng.roses.kernel.log.business.mapper.SysLogBusinessMapper">
|
||||
|
||||
</mapper>
|
|
@ -0,0 +1,75 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.pojo.request;
|
||||
|
||||
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 业务日志记录封装类
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class SysLogBusinessRequest extends BaseRequest {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@NotNull(message = "主键不能为空", groups = {edit.class, delete.class})
|
||||
@ChineseDescription("主键")
|
||||
private Long businessLogId;
|
||||
|
||||
/**
|
||||
* 日志的业务分类的编码
|
||||
*/
|
||||
@ChineseDescription("日志的业务分类的编码")
|
||||
private String logTypeCode;
|
||||
|
||||
/**
|
||||
* 日志的标题,摘要信息
|
||||
*/
|
||||
@ChineseDescription("日志的标题,摘要信息")
|
||||
private String logTitle;
|
||||
|
||||
/**
|
||||
* 日志记录的内容
|
||||
*/
|
||||
@ChineseDescription("日志记录的内容")
|
||||
private String logContent;
|
||||
|
||||
/**
|
||||
* 调用链唯一id,一个id代表一次接口调用
|
||||
*/
|
||||
@ChineseDescription("调用链唯一id,一个id代表一次接口调用")
|
||||
private Long traceId;
|
||||
|
||||
/**
|
||||
* 当前用户请求的url
|
||||
*/
|
||||
@ChineseDescription("当前用户请求的url")
|
||||
private String requestUrl;
|
||||
|
||||
/**
|
||||
* 请求http方法
|
||||
*/
|
||||
@ChineseDescription("请求http方法")
|
||||
private String httpMethod;
|
||||
|
||||
/**
|
||||
* 客户端的ip
|
||||
*/
|
||||
@ChineseDescription("客户端的ip")
|
||||
private String clientIp;
|
||||
|
||||
/**
|
||||
* 业务操作的用户id
|
||||
*/
|
||||
@ChineseDescription("业务操作的用户id")
|
||||
private Long userId;
|
||||
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.service;
|
||||
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.business.entity.SysLogBusiness;
|
||||
import cn.stylefeng.roses.kernel.log.business.pojo.request.SysLogBusinessRequest;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 业务日志记录 服务类
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
public interface SysLogBusinessService extends IService<SysLogBusiness> {
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*
|
||||
* @param sysLogBusinessRequest 请求参数
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
void add(SysLogBusinessRequest sysLogBusinessRequest);
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*
|
||||
* @param sysLogBusinessRequest 请求参数
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
void del(SysLogBusinessRequest sysLogBusinessRequest);
|
||||
|
||||
/**
|
||||
* 编辑
|
||||
*
|
||||
* @param sysLogBusinessRequest 请求参数
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
void edit(SysLogBusinessRequest sysLogBusinessRequest);
|
||||
|
||||
/**
|
||||
* 查询详情
|
||||
*
|
||||
* @param sysLogBusinessRequest 请求参数
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
SysLogBusiness detail(SysLogBusinessRequest sysLogBusinessRequest);
|
||||
|
||||
/**
|
||||
* 获取列表
|
||||
*
|
||||
* @param sysLogBusinessRequest 请求参数
|
||||
* @return List<SysLogBusiness> 返回结果
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
List<SysLogBusiness> findList(SysLogBusinessRequest sysLogBusinessRequest);
|
||||
|
||||
/**
|
||||
* 获取列表(带分页)
|
||||
*
|
||||
* @param sysLogBusinessRequest 请求参数
|
||||
* @return PageResult<SysLogBusiness> 返回结果
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
PageResult<SysLogBusiness> findPage(SysLogBusinessRequest sysLogBusinessRequest);
|
||||
|
||||
/**
|
||||
* 批量保存业务日志
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/21 17:01
|
||||
*/
|
||||
void saveBatchLogs(SysLogBusiness context, List<String> batchContentList);
|
||||
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
package cn.stylefeng.roses.kernel.log.business.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.business.entity.SysLogBusiness;
|
||||
import cn.stylefeng.roses.kernel.log.business.enums.SysLogBusinessExceptionEnum;
|
||||
import cn.stylefeng.roses.kernel.log.business.mapper.SysLogBusinessMapper;
|
||||
import cn.stylefeng.roses.kernel.log.business.pojo.request.SysLogBusinessRequest;
|
||||
import cn.stylefeng.roses.kernel.log.business.service.SysLogBusinessService;
|
||||
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 业务日志记录业务实现层
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
@Service
|
||||
public class SysLogBusinessServiceImpl extends ServiceImpl<SysLogBusinessMapper, SysLogBusiness> implements SysLogBusinessService {
|
||||
|
||||
@Override
|
||||
public void add(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
SysLogBusiness sysLogBusiness = new SysLogBusiness();
|
||||
BeanUtil.copyProperties(sysLogBusinessRequest, sysLogBusiness);
|
||||
this.save(sysLogBusiness);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void del(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
SysLogBusiness sysLogBusiness = this.querySysLogBusiness(sysLogBusinessRequest);
|
||||
this.removeById(sysLogBusiness.getBusinessLogId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void edit(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
SysLogBusiness sysLogBusiness = this.querySysLogBusiness(sysLogBusinessRequest);
|
||||
BeanUtil.copyProperties(sysLogBusinessRequest, sysLogBusiness);
|
||||
this.updateById(sysLogBusiness);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysLogBusiness detail(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
return this.querySysLogBusiness(sysLogBusinessRequest);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<SysLogBusiness> findPage(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
LambdaQueryWrapper<SysLogBusiness> wrapper = createWrapper(sysLogBusinessRequest);
|
||||
Page<SysLogBusiness> sysRolePage = this.page(PageFactory.defaultPage(), wrapper);
|
||||
return PageResultFactory.createPageResult(sysRolePage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveBatchLogs(SysLogBusiness context, List<String> batchContentList) {
|
||||
|
||||
if (ObjectUtil.isEmpty(batchContentList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<SysLogBusiness> sysLogBusinesses = new ArrayList<>();
|
||||
for (String content : batchContentList) {
|
||||
SysLogBusiness sysLogBusiness = new SysLogBusiness();
|
||||
BeanUtil.copyProperties(context, sysLogBusiness);
|
||||
sysLogBusiness.setLogContent(content);
|
||||
sysLogBusinesses.add(sysLogBusiness);
|
||||
}
|
||||
|
||||
this.getBaseMapper().insertBatchSomeColumn(sysLogBusinesses);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SysLogBusiness> findList(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
LambdaQueryWrapper<SysLogBusiness> wrapper = this.createWrapper(sysLogBusinessRequest);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取信息
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
private SysLogBusiness querySysLogBusiness(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
SysLogBusiness sysLogBusiness = this.getById(sysLogBusinessRequest.getBusinessLogId());
|
||||
if (ObjectUtil.isEmpty(sysLogBusiness)) {
|
||||
throw new ServiceException(SysLogBusinessExceptionEnum.SYS_LOG_BUSINESS_NOT_EXISTED);
|
||||
}
|
||||
return sysLogBusiness;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建查询wrapper
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/07/21 15:00
|
||||
*/
|
||||
private LambdaQueryWrapper<SysLogBusiness> createWrapper(SysLogBusinessRequest sysLogBusinessRequest) {
|
||||
LambdaQueryWrapper<SysLogBusiness> queryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
// 根据日志类型编码查询
|
||||
String logTypeCode = sysLogBusinessRequest.getLogTypeCode();
|
||||
queryWrapper.eq(ObjectUtil.isNotEmpty(logTypeCode), SysLogBusiness::getLogTypeCode, logTypeCode);
|
||||
|
||||
// 根据调用链日志信息查询
|
||||
Long traceId = sysLogBusinessRequest.getTraceId();
|
||||
queryWrapper.eq(ObjectUtil.isNotNull(traceId), SysLogBusiness::getTraceId, traceId);
|
||||
|
||||
// 根据文本检索内容查询
|
||||
String searchText = sysLogBusinessRequest.getSearchText();
|
||||
if (ObjectUtil.isNotEmpty(searchText)) {
|
||||
queryWrapper.nested(wrap -> {
|
||||
wrap.like(SysLogBusiness::getLogTitle, searchText).or().like(SysLogBusiness::getLogContent, searchText);
|
||||
});
|
||||
}
|
||||
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue