1. 限制记录 api 日志的字段长度

2. 完整记录所有的 databus api 的请求日志
3. 新增 iwork 同步可以按 id 维度进行
4. 新增自动扫描 BusinessBaseDO 的 公司部门数据权限模式
This commit is contained in:
chenbowen
2025-12-01 17:46:42 +08:00
parent e9542acd27
commit 95d905e76f
15 changed files with 606 additions and 66 deletions

View File

@@ -26,11 +26,76 @@ import java.time.LocalDateTime;
@KeySequence(value = "infra_api_error_log_seq")
public class ApiErrorLogDO extends BaseDO {
/**
* {@link #traceId} 的最大长度
*/
public static final Integer TRACE_ID_MAX_LENGTH = 64;
/**
* {@link #applicationName} 的最大长度
*/
public static final Integer APPLICATION_NAME_MAX_LENGTH = 50;
/**
* {@link #requestMethod} 的最大长度
*/
public static final Integer REQUEST_METHOD_MAX_LENGTH = 16;
/**
* {@link #requestUrl} 的最大长度
*/
public static final Integer REQUEST_URL_MAX_LENGTH = 255;
/**
* {@link #requestParams} 的最大长度
*/
public static final Integer REQUEST_PARAMS_MAX_LENGTH = 8000;
/**
* {@link #userIp} 的最大长度
*/
public static final Integer USER_IP_MAX_LENGTH = 50;
/**
* {@link #userAgent} 的最大长度
*/
public static final Integer USER_AGENT_MAX_LENGTH = 512;
/**
* {@link #exceptionName} 的最大长度
*/
public static final Integer EXCEPTION_NAME_MAX_LENGTH = 128;
/**
* {@link #exceptionClassName} 的最大长度
*/
public static final Integer EXCEPTION_CLASS_NAME_MAX_LENGTH = 512;
/**
* {@link #exceptionFileName} 的最大长度
*/
public static final Integer EXCEPTION_FILE_NAME_MAX_LENGTH = 512;
/**
* {@link #exceptionMethodName} 的最大长度
*/
public static final Integer EXCEPTION_METHOD_NAME_MAX_LENGTH = 512;
/**
* {@link #exceptionMessage} 的最大长度
*/
public static final Integer EXCEPTION_MESSAGE_MAX_LENGTH = 4000;
/**
* {@link #exceptionRootCauseMessage} 的最大长度
*/
public static final Integer EXCEPTION_ROOT_CAUSE_MESSAGE_MAX_LENGTH = 4000;
/**
* {@link #exceptionStackTrace} 的最大长度
*/
public static final Integer EXCEPTION_STACK_TRACE_MAX_LENGTH = 8000;
/**
* 编号
*/

View File

@@ -18,7 +18,6 @@ import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.infra.dal.dataobject.logger.ApiErrorLogDO.REQUEST_PARAMS_MAX_LENGTH;
import static com.zt.plat.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND;
import static com.zt.plat.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_PROCESSED;
@@ -39,7 +38,7 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService {
public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) {
ApiErrorLogDO apiErrorLog = BeanUtils.toBean(createDTO, ApiErrorLogDO.class)
.setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus());
apiErrorLog.setRequestParams(StrUtils.maxLength(apiErrorLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH));
truncateOverflowFields(apiErrorLog);
if (TenantContextHolder.getTenantId() != null) {
apiErrorLogMapper.insert(apiErrorLog);
} else {
@@ -48,6 +47,35 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService {
}
}
private void truncateOverflowFields(ApiErrorLogDO apiErrorLog) {
apiErrorLog.setTraceId(StrUtils.maxLength(apiErrorLog.getTraceId(), ApiErrorLogDO.TRACE_ID_MAX_LENGTH));
apiErrorLog.setApplicationName(StrUtils.maxLength(apiErrorLog.getApplicationName(),
ApiErrorLogDO.APPLICATION_NAME_MAX_LENGTH));
apiErrorLog.setRequestMethod(StrUtils.maxLength(apiErrorLog.getRequestMethod(),
ApiErrorLogDO.REQUEST_METHOD_MAX_LENGTH));
apiErrorLog.setRequestUrl(StrUtils.maxLength(apiErrorLog.getRequestUrl(),
ApiErrorLogDO.REQUEST_URL_MAX_LENGTH));
apiErrorLog.setRequestParams(StrUtils.maxLength(apiErrorLog.getRequestParams(),
ApiErrorLogDO.REQUEST_PARAMS_MAX_LENGTH));
apiErrorLog.setUserIp(StrUtils.maxLength(apiErrorLog.getUserIp(), ApiErrorLogDO.USER_IP_MAX_LENGTH));
apiErrorLog.setUserAgent(StrUtils.maxLength(apiErrorLog.getUserAgent(),
ApiErrorLogDO.USER_AGENT_MAX_LENGTH));
apiErrorLog.setExceptionName(StrUtils.maxLength(apiErrorLog.getExceptionName(),
ApiErrorLogDO.EXCEPTION_NAME_MAX_LENGTH));
apiErrorLog.setExceptionClassName(StrUtils.maxLength(apiErrorLog.getExceptionClassName(),
ApiErrorLogDO.EXCEPTION_CLASS_NAME_MAX_LENGTH));
apiErrorLog.setExceptionFileName(StrUtils.maxLength(apiErrorLog.getExceptionFileName(),
ApiErrorLogDO.EXCEPTION_FILE_NAME_MAX_LENGTH));
apiErrorLog.setExceptionMethodName(StrUtils.maxLength(apiErrorLog.getExceptionMethodName(),
ApiErrorLogDO.EXCEPTION_METHOD_NAME_MAX_LENGTH));
apiErrorLog.setExceptionMessage(StrUtils.maxLength(apiErrorLog.getExceptionMessage(),
ApiErrorLogDO.EXCEPTION_MESSAGE_MAX_LENGTH));
apiErrorLog.setExceptionRootCauseMessage(StrUtils.maxLength(apiErrorLog.getExceptionRootCauseMessage(),
ApiErrorLogDO.EXCEPTION_ROOT_CAUSE_MESSAGE_MAX_LENGTH));
apiErrorLog.setExceptionStackTrace(StrUtils.maxLength(apiErrorLog.getExceptionStackTrace(),
ApiErrorLogDO.EXCEPTION_STACK_TRACE_MAX_LENGTH));
}
@Override
public PageResult<ApiErrorLogDO> getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO) {
return apiErrorLogMapper.selectPage(pageReqVO);

View File

@@ -3,6 +3,7 @@ package com.zt.plat.module.infra.service.logger;
import com.zt.plat.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO;
import com.zt.plat.framework.common.enums.UserTypeEnum;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.string.StrUtils;
import com.zt.plat.framework.test.core.ut.BaseDbUnitTest;
import com.zt.plat.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO;
import com.zt.plat.module.infra.dal.dataobject.logger.ApiErrorLogDO;
@@ -13,6 +14,7 @@ import org.springframework.context.annotation.Import;
import jakarta.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import static cn.hutool.core.util.RandomUtil.randomEle;
@@ -79,15 +81,63 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
@Test
public void testCreateApiErrorLog() {
// 准备参数
ApiErrorLogCreateReqDTO createDTO = randomPojo(ApiErrorLogCreateReqDTO.class);
// 准备参数:手动设置多个超长字段,确保持久化前会被截断
ApiErrorLogCreateReqDTO createDTO = new ApiErrorLogCreateReqDTO();
createDTO.setTraceId(repeat('t', ApiErrorLogDO.TRACE_ID_MAX_LENGTH + 20));
createDTO.setUserId(10086L);
createDTO.setUserType(UserTypeEnum.ADMIN.getValue());
createDTO.setApplicationName(repeat('a', ApiErrorLogDO.APPLICATION_NAME_MAX_LENGTH + 5));
createDTO.setRequestMethod(repeat('b', ApiErrorLogDO.REQUEST_METHOD_MAX_LENGTH + 10));
createDTO.setRequestUrl(repeat('c', ApiErrorLogDO.REQUEST_URL_MAX_LENGTH + 20));
createDTO.setRequestParams(repeat('d', ApiErrorLogDO.REQUEST_PARAMS_MAX_LENGTH + 50));
createDTO.setUserIp(repeat('1', ApiErrorLogDO.USER_IP_MAX_LENGTH + 10));
createDTO.setUserAgent(repeat('e', ApiErrorLogDO.USER_AGENT_MAX_LENGTH + 100));
createDTO.setExceptionTime(LocalDateTime.of(2025, 1, 1, 10, 20, 30));
createDTO.setExceptionName(repeat('f', ApiErrorLogDO.EXCEPTION_NAME_MAX_LENGTH + 10));
createDTO.setExceptionClassName(repeat('g', ApiErrorLogDO.EXCEPTION_CLASS_NAME_MAX_LENGTH + 10));
createDTO.setExceptionFileName(repeat('h', ApiErrorLogDO.EXCEPTION_FILE_NAME_MAX_LENGTH + 10));
createDTO.setExceptionMethodName(repeat('i', ApiErrorLogDO.EXCEPTION_METHOD_NAME_MAX_LENGTH + 10));
createDTO.setExceptionLineNumber(256);
createDTO.setExceptionStackTrace(repeat('s', ApiErrorLogDO.EXCEPTION_STACK_TRACE_MAX_LENGTH + 100));
createDTO.setExceptionRootCauseMessage(repeat('r', ApiErrorLogDO.EXCEPTION_ROOT_CAUSE_MESSAGE_MAX_LENGTH + 80));
createDTO.setExceptionMessage(repeat('m', ApiErrorLogDO.EXCEPTION_MESSAGE_MAX_LENGTH + 60));
// 调用
apiErrorLogService.createApiErrorLog(createDTO);
// 断言
ApiErrorLogDO apiErrorLogDO = apiErrorLogMapper.selectOne(null);
assertPojoEquals(createDTO, apiErrorLogDO);
assertEquals(createDTO.getUserId(), apiErrorLogDO.getUserId());
assertEquals(createDTO.getUserType(), apiErrorLogDO.getUserType());
assertEquals(createDTO.getExceptionTime(), apiErrorLogDO.getExceptionTime());
assertEquals(createDTO.getExceptionLineNumber(), apiErrorLogDO.getExceptionLineNumber());
assertEquals(ApiErrorLogProcessStatusEnum.INIT.getStatus(), apiErrorLogDO.getProcessStatus());
assertTruncated(createDTO.getTraceId(), apiErrorLogDO.getTraceId(), ApiErrorLogDO.TRACE_ID_MAX_LENGTH);
assertTruncated(createDTO.getApplicationName(), apiErrorLogDO.getApplicationName(),
ApiErrorLogDO.APPLICATION_NAME_MAX_LENGTH);
assertTruncated(createDTO.getRequestMethod(), apiErrorLogDO.getRequestMethod(),
ApiErrorLogDO.REQUEST_METHOD_MAX_LENGTH);
assertTruncated(createDTO.getRequestUrl(), apiErrorLogDO.getRequestUrl(),
ApiErrorLogDO.REQUEST_URL_MAX_LENGTH);
assertTruncated(createDTO.getRequestParams(), apiErrorLogDO.getRequestParams(),
ApiErrorLogDO.REQUEST_PARAMS_MAX_LENGTH);
assertTruncated(createDTO.getUserIp(), apiErrorLogDO.getUserIp(), ApiErrorLogDO.USER_IP_MAX_LENGTH);
assertTruncated(createDTO.getUserAgent(), apiErrorLogDO.getUserAgent(),
ApiErrorLogDO.USER_AGENT_MAX_LENGTH);
assertTruncated(createDTO.getExceptionName(), apiErrorLogDO.getExceptionName(),
ApiErrorLogDO.EXCEPTION_NAME_MAX_LENGTH);
assertTruncated(createDTO.getExceptionClassName(), apiErrorLogDO.getExceptionClassName(),
ApiErrorLogDO.EXCEPTION_CLASS_NAME_MAX_LENGTH);
assertTruncated(createDTO.getExceptionFileName(), apiErrorLogDO.getExceptionFileName(),
ApiErrorLogDO.EXCEPTION_FILE_NAME_MAX_LENGTH);
assertTruncated(createDTO.getExceptionMethodName(), apiErrorLogDO.getExceptionMethodName(),
ApiErrorLogDO.EXCEPTION_METHOD_NAME_MAX_LENGTH);
assertTruncated(createDTO.getExceptionStackTrace(), apiErrorLogDO.getExceptionStackTrace(),
ApiErrorLogDO.EXCEPTION_STACK_TRACE_MAX_LENGTH);
assertTruncated(createDTO.getExceptionRootCauseMessage(), apiErrorLogDO.getExceptionRootCauseMessage(),
ApiErrorLogDO.EXCEPTION_ROOT_CAUSE_MESSAGE_MAX_LENGTH);
assertTruncated(createDTO.getExceptionMessage(), apiErrorLogDO.getExceptionMessage(),
ApiErrorLogDO.EXCEPTION_MESSAGE_MAX_LENGTH);
}
@Test
@@ -161,4 +211,12 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
assertPojoEquals(log02, logs.get(0), "createTime", "updateTime");
}
private static void assertTruncated(String source, String actual, int maxLength) {
assertEquals(StrUtils.maxLength(source, maxLength), actual);
}
private static String repeat(char ch, int length) {
return String.valueOf(ch).repeat(Math.max(length, 0));
}
}