mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	【功能修复】全局:请求租户不存在时,记录访问日志、操作日志异常的问题
This commit is contained in:
		| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.apilog.core.service; | |||||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | ||||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
|  | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.springframework.scheduling.annotation.Async; | import org.springframework.scheduling.annotation.Async; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -13,6 +14,7 @@ import org.springframework.scheduling.annotation.Async; | |||||||
|  * @author 芋道源码 |  * @author 芋道源码 | ||||||
|  */ |  */ | ||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
|  | @Slf4j | ||||||
| public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { | public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { | ||||||
|  |  | ||||||
|     private final ApiAccessLogApi apiAccessLogApi; |     private final ApiAccessLogApi apiAccessLogApi; | ||||||
| @@ -20,7 +22,12 @@ public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkSe | |||||||
|     @Override |     @Override | ||||||
|     @Async |     @Async | ||||||
|     public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) { |     public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) { | ||||||
|         apiAccessLogApi.createApiAccessLog(reqDTO); |         try { | ||||||
|  |             apiAccessLogApi.createApiAccessLog(reqDTO); | ||||||
|  |         } catch (Throwable ex) { | ||||||
|  |             // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||||||
|  |             log.error("[createApiAccessLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.apilog.core.service; | |||||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
|  | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.springframework.scheduling.annotation.Async; | import org.springframework.scheduling.annotation.Async; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -13,6 +14,7 @@ import org.springframework.scheduling.annotation.Async; | |||||||
|  * @author 芋道源码 |  * @author 芋道源码 | ||||||
|  */ |  */ | ||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
|  | @Slf4j | ||||||
| public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { | public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { | ||||||
|  |  | ||||||
|     private final ApiErrorLogApi apiErrorLogApi; |     private final ApiErrorLogApi apiErrorLogApi; | ||||||
| @@ -20,7 +22,12 @@ public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkServ | |||||||
|     @Override |     @Override | ||||||
|     @Async |     @Async | ||||||
|     public void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO) { |     public void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO) { | ||||||
|         apiErrorLogApi.createApiErrorLog(reqDTO); |         try { | ||||||
|  |             apiErrorLogApi.createApiErrorLog(reqDTO); | ||||||
|  |         } catch (Throwable ex) { | ||||||
|  |             // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||||||
|  |             log.error("[createApiErrorLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -328,6 +328,12 @@ public class GlobalExceptionHandler { | |||||||
|             return CommonResult.error(NOT_IMPLEMENTED.getCode(), |             return CommonResult.error(NOT_IMPLEMENTED.getCode(), | ||||||
|                     "[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); |                     "[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); | ||||||
|         } |         } | ||||||
|  |         // 8. AI 大模型 | ||||||
|  |         if (message.contains("ai_")) { | ||||||
|  |             log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | ||||||
|  |             return CommonResult.error(NOT_IMPLEMENTED.getCode(), | ||||||
|  |                     "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | ||||||
|  |         } | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.infra.service.logger; | |||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||||
|  | import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | ||||||
|  | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | ||||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||||||
| import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; | ||||||
| import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; | ||||||
| @@ -35,7 +37,12 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService { | |||||||
|         ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createDTO, ApiAccessLogDO.class); |         ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createDTO, ApiAccessLogDO.class); | ||||||
|         apiAccessLog.setRequestParams(StrUtil.maxLength(apiAccessLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); |         apiAccessLog.setRequestParams(StrUtil.maxLength(apiAccessLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); | ||||||
|         apiAccessLog.setResultMsg(StrUtil.maxLength(apiAccessLog.getResultMsg(), RESULT_MSG_MAX_LENGTH)); |         apiAccessLog.setResultMsg(StrUtil.maxLength(apiAccessLog.getResultMsg(), RESULT_MSG_MAX_LENGTH)); | ||||||
|         apiAccessLogMapper.insert(apiAccessLog); |         if (TenantContextHolder.getTenantId() != null) { | ||||||
|  |             apiAccessLogMapper.insert(apiAccessLog); | ||||||
|  |         } else { | ||||||
|  |             // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败! | ||||||
|  |             TenantUtils.executeIgnore(() -> apiAccessLogMapper.insert(apiAccessLog)); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.infra.service.logger; | |||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||||
|  | import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | ||||||
|  | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | ||||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||||||
| import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; | ||||||
| import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; | 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 | |||||||
|  * |  * | ||||||
|  * @author 芋道源码 |  * @author 芋道源码 | ||||||
|  */ |  */ | ||||||
| @Slf4j |  | ||||||
| @Service | @Service | ||||||
| @Validated | @Validated | ||||||
|  | @Slf4j | ||||||
| public class ApiErrorLogServiceImpl implements ApiErrorLogService { | public class ApiErrorLogServiceImpl implements ApiErrorLogService { | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
| @@ -38,7 +40,12 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService { | |||||||
|         ApiErrorLogDO apiErrorLog = BeanUtils.toBean(createDTO, ApiErrorLogDO.class) |         ApiErrorLogDO apiErrorLog = BeanUtils.toBean(createDTO, ApiErrorLogDO.class) | ||||||
|                 .setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); |                 .setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); | ||||||
|         apiErrorLog.setRequestParams(StrUtil.maxLength(apiErrorLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); |         apiErrorLog.setRequestParams(StrUtil.maxLength(apiErrorLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); | ||||||
|         apiErrorLogMapper.insert(apiErrorLog); |         if (TenantContextHolder.getTenantId() != null) { | ||||||
|  |             apiErrorLogMapper.insert(apiErrorLog); | ||||||
|  |         } else { | ||||||
|  |             // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败! | ||||||
|  |             TenantUtils.executeIgnore(() -> apiErrorLogMapper.insert(apiErrorLog)); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -23,9 +23,9 @@ public interface OperateLogApi { | |||||||
|     /** |     /** | ||||||
|      * 获取指定模块的指定数据的操作日志分页 |      * 获取指定模块的指定数据的操作日志分页 | ||||||
|      * |      * | ||||||
|      * @param pageReqVO 请求 |      * @param pageReqDTO 请求 | ||||||
|      * @return 操作日志分页 |      * @return 操作日志分页 | ||||||
|      */ |      */ | ||||||
|     PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO); |     PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqDTO); | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ public class OperateLogApiImpl implements OperateLogApi { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     @TransMethodResult |     @TransMethodResult | ||||||
|     public PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO) { |     public PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqDTO) { | ||||||
|         PageResult<OperateLogDO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO); |         PageResult<OperateLogDO> operateLogPage = operateLogService.getOperateLogPage(pageReqDTO); | ||||||
|         return BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class); |         return BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV