1. 限制记录 api 日志的字段长度
2. 完整记录所有的 databus api 的请求日志 3. 新增 iwork 同步可以按 id 维度进行 4. 新增自动扫描 BusinessBaseDO 的 公司部门数据权限模式
This commit is contained in:
@@ -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;
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user