Commit bbdf9e9b2e2b529a6cfec81f76bf90b520f27136
1 parent
63303539
【功能修复】全局:请求租户不存在时,记录访问日志、操作日志异常的问题
Showing
7 changed files
with
43 additions
and
9 deletions
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java
| ... | ... | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.apilog.core.service; |
| 3 | 3 | import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; |
| 4 | 4 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; |
| 5 | 5 | import lombok.RequiredArgsConstructor; |
| 6 | +import lombok.extern.slf4j.Slf4j; | |
| 6 | 7 | import org.springframework.scheduling.annotation.Async; |
| 7 | 8 | |
| 8 | 9 | /** |
| ... | ... | @@ -13,6 +14,7 @@ import org.springframework.scheduling.annotation.Async; |
| 13 | 14 | * @author 芋道源码 |
| 14 | 15 | */ |
| 15 | 16 | @RequiredArgsConstructor |
| 17 | +@Slf4j | |
| 16 | 18 | public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { |
| 17 | 19 | |
| 18 | 20 | private final ApiAccessLogApi apiAccessLogApi; |
| ... | ... | @@ -20,7 +22,12 @@ public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkSe |
| 20 | 22 | @Override |
| 21 | 23 | @Async |
| 22 | 24 | public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) { |
| 23 | - apiAccessLogApi.createApiAccessLog(reqDTO); | |
| 25 | + try { | |
| 26 | + apiAccessLogApi.createApiAccessLog(reqDTO); | |
| 27 | + } catch (Throwable ex) { | |
| 28 | + // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | |
| 29 | + log.error("[createApiAccessLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | |
| 30 | + } | |
| 24 | 31 | } |
| 25 | 32 | |
| 26 | 33 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java
| ... | ... | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.apilog.core.service; |
| 3 | 3 | import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; |
| 4 | 4 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; |
| 5 | 5 | import lombok.RequiredArgsConstructor; |
| 6 | +import lombok.extern.slf4j.Slf4j; | |
| 6 | 7 | import org.springframework.scheduling.annotation.Async; |
| 7 | 8 | |
| 8 | 9 | /** |
| ... | ... | @@ -13,6 +14,7 @@ import org.springframework.scheduling.annotation.Async; |
| 13 | 14 | * @author 芋道源码 |
| 14 | 15 | */ |
| 15 | 16 | @RequiredArgsConstructor |
| 17 | +@Slf4j | |
| 16 | 18 | public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { |
| 17 | 19 | |
| 18 | 20 | private final ApiErrorLogApi apiErrorLogApi; |
| ... | ... | @@ -20,7 +22,12 @@ public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkServ |
| 20 | 22 | @Override |
| 21 | 23 | @Async |
| 22 | 24 | public void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO) { |
| 23 | - apiErrorLogApi.createApiErrorLog(reqDTO); | |
| 25 | + try { | |
| 26 | + apiErrorLogApi.createApiErrorLog(reqDTO); | |
| 27 | + } catch (Throwable ex) { | |
| 28 | + // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | |
| 29 | + log.error("[createApiErrorLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | |
| 30 | + } | |
| 24 | 31 | } |
| 25 | 32 | |
| 26 | 33 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
| ... | ... | @@ -328,6 +328,12 @@ public class GlobalExceptionHandler { |
| 328 | 328 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 329 | 329 | "[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); |
| 330 | 330 | } |
| 331 | + // 8. AI 大模型 | |
| 332 | + if (message.contains("ai_")) { | |
| 333 | + log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | |
| 334 | + return CommonResult.error(NOT_IMPLEMENTED.getCode(), | |
| 335 | + "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | |
| 336 | + } | |
| 331 | 337 | return null; |
| 332 | 338 | } |
| 333 | 339 | ... | ... |
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java
| ... | ... | @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.infra.service.logger; |
| 3 | 3 | import cn.hutool.core.util.StrUtil; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | |
| 7 | +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | |
| 6 | 8 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; |
| 7 | 9 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; |
| 8 | 10 | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; |
| ... | ... | @@ -35,7 +37,12 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService { |
| 35 | 37 | ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createDTO, ApiAccessLogDO.class); |
| 36 | 38 | apiAccessLog.setRequestParams(StrUtil.maxLength(apiAccessLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); |
| 37 | 39 | apiAccessLog.setResultMsg(StrUtil.maxLength(apiAccessLog.getResultMsg(), RESULT_MSG_MAX_LENGTH)); |
| 38 | - apiAccessLogMapper.insert(apiAccessLog); | |
| 40 | + if (TenantContextHolder.getTenantId() != null) { | |
| 41 | + apiAccessLogMapper.insert(apiAccessLog); | |
| 42 | + } else { | |
| 43 | + // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败! | |
| 44 | + TenantUtils.executeIgnore(() -> apiAccessLogMapper.insert(apiAccessLog)); | |
| 45 | + } | |
| 39 | 46 | } |
| 40 | 47 | |
| 41 | 48 | @Override | ... | ... |
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java
| ... | ... | @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.infra.service.logger; |
| 3 | 3 | import cn.hutool.core.util.StrUtil; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | |
| 7 | +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | |
| 6 | 8 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; |
| 7 | 9 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; |
| 8 | 10 | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; |
| ... | ... | @@ -25,9 +27,9 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.API_ERROR_L |
| 25 | 27 | * |
| 26 | 28 | * @author 芋道源码 |
| 27 | 29 | */ |
| 28 | -@Slf4j | |
| 29 | 30 | @Service |
| 30 | 31 | @Validated |
| 32 | +@Slf4j | |
| 31 | 33 | public class ApiErrorLogServiceImpl implements ApiErrorLogService { |
| 32 | 34 | |
| 33 | 35 | @Resource |
| ... | ... | @@ -38,7 +40,12 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService { |
| 38 | 40 | ApiErrorLogDO apiErrorLog = BeanUtils.toBean(createDTO, ApiErrorLogDO.class) |
| 39 | 41 | .setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); |
| 40 | 42 | apiErrorLog.setRequestParams(StrUtil.maxLength(apiErrorLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); |
| 41 | - apiErrorLogMapper.insert(apiErrorLog); | |
| 43 | + if (TenantContextHolder.getTenantId() != null) { | |
| 44 | + apiErrorLogMapper.insert(apiErrorLog); | |
| 45 | + } else { | |
| 46 | + // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败! | |
| 47 | + TenantUtils.executeIgnore(() -> apiErrorLogMapper.insert(apiErrorLog)); | |
| 48 | + } | |
| 42 | 49 | } |
| 43 | 50 | |
| 44 | 51 | @Override | ... | ... |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/OperateLogApi.java
| ... | ... | @@ -23,9 +23,9 @@ public interface OperateLogApi { |
| 23 | 23 | /** |
| 24 | 24 | * 获取指定模块的指定数据的操作日志分页 |
| 25 | 25 | * |
| 26 | - * @param pageReqVO 请求 | |
| 26 | + * @param pageReqDTO 请求 | |
| 27 | 27 | * @return 操作日志分页 |
| 28 | 28 | */ |
| 29 | - PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO); | |
| 29 | + PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqDTO); | |
| 30 | 30 | |
| 31 | 31 | } | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/logger/OperateLogApiImpl.java
| ... | ... | @@ -33,8 +33,8 @@ public class OperateLogApiImpl implements OperateLogApi { |
| 33 | 33 | |
| 34 | 34 | @Override |
| 35 | 35 | @TransMethodResult |
| 36 | - public PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO) { | |
| 37 | - PageResult<OperateLogDO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO); | |
| 36 | + public PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqDTO) { | |
| 37 | + PageResult<OperateLogDO> operateLogPage = operateLogService.getOperateLogPage(pageReqDTO); | |
| 38 | 38 | return BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class); |
| 39 | 39 | } |
| 40 | 40 | ... | ... |