mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	【代码优化】框架:简化 api 访问日志、错误日志的记录逻辑
This commit is contained in:
		| @@ -2,15 +2,10 @@ package cn.iocoder.yudao.framework.apilog.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter; | ||||
| import cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor; | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; | ||||
| import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | ||||
| import cn.iocoder.yudao.framework.web.config.WebProperties; | ||||
| import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||||
| import jakarta.servlet.Filter; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.boot.autoconfigure.AutoConfiguration; | ||||
| @@ -23,18 +18,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||||
| @AutoConfiguration(after = YudaoWebAutoConfiguration.class) | ||||
| public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer { | ||||
|  | ||||
|     @Bean | ||||
|     @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | ||||
|     public ApiAccessLogFrameworkService apiAccessLogFrameworkService(ApiAccessLogApi apiAccessLogApi) { | ||||
|         return new ApiAccessLogFrameworkServiceImpl(apiAccessLogApi); | ||||
|     } | ||||
|  | ||||
|     @Bean | ||||
|     @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | ||||
|     public ApiErrorLogFrameworkService apiErrorLogFrameworkService(ApiErrorLogApi apiErrorLogApi) { | ||||
|         return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 | ||||
|      */ | ||||
| @@ -42,8 +25,8 @@ public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer { | ||||
|     @ConditionalOnProperty(prefix = "yudao.access-log", value = "enable", matchIfMissing = true) // 允许使用 yudao.access-log.enable=false 禁用访问日志 | ||||
|     public FilterRegistrationBean<ApiAccessLogFilter> apiAccessLogFilter(WebProperties webProperties, | ||||
|                                                                          @Value("${spring.application.name}") String applicationName, | ||||
|                                                                          ApiAccessLogFrameworkService apiAccessLogFrameworkService) { | ||||
|         ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService); | ||||
|                                                                          ApiAccessLogApi apiAccessLogApi) { | ||||
|         ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogApi); | ||||
|         return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,6 @@ import cn.hutool.core.util.BooleanUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; | ||||
| import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum; | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; | ||||
| import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||
| @@ -18,6 +17,7 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||||
| import cn.iocoder.yudao.framework.web.config.WebProperties; | ||||
| import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter; | ||||
| import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||||
| import com.fasterxml.jackson.databind.JsonNode; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| @@ -36,7 +36,7 @@ import java.time.temporal.ChronoUnit; | ||||
| import java.util.Iterator; | ||||
| import java.util.Map; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor.*; | ||||
| import static cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor.ATTRIBUTE_HANDLER_METHOD; | ||||
| import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; | ||||
|  | ||||
| /** | ||||
| @@ -53,12 +53,12 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | ||||
|  | ||||
|     private final String applicationName; | ||||
|  | ||||
|     private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; | ||||
|     private final ApiAccessLogApi apiAccessLogApi; | ||||
|  | ||||
|     public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogFrameworkService apiAccessLogFrameworkService) { | ||||
|     public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogApi apiAccessLogApi) { | ||||
|         super(webProperties); | ||||
|         this.applicationName = applicationName; | ||||
|         this.apiAccessLogFrameworkService = apiAccessLogFrameworkService; | ||||
|         this.apiAccessLogApi = apiAccessLogApi; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -91,7 +91,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | ||||
|             if (!enable) { | ||||
|                 return; | ||||
|             } | ||||
|             apiAccessLogFrameworkService.createApiAccessLog(accessLog); | ||||
|             apiAccessLogApi.createApiAccessLogAsync(accessLog); | ||||
|         } catch (Throwable th) { | ||||
|             log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); | ||||
|         } | ||||
|   | ||||
| @@ -1,19 +0,0 @@ | ||||
| package cn.iocoder.yudao.framework.apilog.core.service; | ||||
|  | ||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||||
|  | ||||
| /** | ||||
|  * API 访问日志 Framework Service 接口 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| public interface ApiAccessLogFrameworkService { | ||||
|  | ||||
|     /** | ||||
|      * 创建 API 访问日志 | ||||
|      * | ||||
|      * @param reqDTO API 访问日志 | ||||
|      */ | ||||
|     void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO); | ||||
|  | ||||
| } | ||||
| @@ -1,33 +0,0 @@ | ||||
| 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.dto.ApiAccessLogCreateReqDTO; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.scheduling.annotation.Async; | ||||
|  | ||||
| /** | ||||
|  * API 访问日志 Framework Service 实现类 | ||||
|  * | ||||
|  * 基于 {@link ApiAccessLogApi} 服务,记录访问日志 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @RequiredArgsConstructor | ||||
| @Slf4j | ||||
| public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { | ||||
|  | ||||
|     private final ApiAccessLogApi apiAccessLogApi; | ||||
|  | ||||
|     @Override | ||||
|     @Async | ||||
|     public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) { | ||||
|         try { | ||||
|             apiAccessLogApi.createApiAccessLog(reqDTO); | ||||
|         } catch (Throwable ex) { | ||||
|             // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||||
|             log.error("[createApiAccessLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,19 +0,0 @@ | ||||
| package cn.iocoder.yudao.framework.apilog.core.service; | ||||
|  | ||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||||
|  | ||||
| /** | ||||
|  * API 错误日志 Framework Service 接口 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| public interface ApiErrorLogFrameworkService { | ||||
|  | ||||
|     /** | ||||
|      * 创建 API 错误日志 | ||||
|      * | ||||
|      * @param reqDTO API 错误日志 | ||||
|      */ | ||||
|     void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO); | ||||
|  | ||||
| } | ||||
| @@ -1,33 +0,0 @@ | ||||
| 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.dto.ApiErrorLogCreateReqDTO; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.scheduling.annotation.Async; | ||||
|  | ||||
| /** | ||||
|  * API 错误日志 Framework Service 实现类 | ||||
|  * | ||||
|  * 基于 {@link ApiErrorLogApi} 服务,记录错误日志 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @RequiredArgsConstructor | ||||
| @Slf4j | ||||
| public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { | ||||
|  | ||||
|     private final ApiErrorLogApi apiErrorLogApi; | ||||
|  | ||||
|     @Override | ||||
|     @Async | ||||
|     public void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO) { | ||||
|         try { | ||||
|             apiErrorLogApi.createApiErrorLog(reqDTO); | ||||
|         } catch (Throwable ex) { | ||||
|             // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||||
|             log.error("[createApiErrorLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,12 +1,14 @@ | ||||
| package cn.iocoder.yudao.framework.web.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; | ||||
| import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | ||||
| import cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter; | ||||
| import cn.iocoder.yudao.framework.web.core.filter.DemoFilter; | ||||
| import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; | ||||
| import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler; | ||||
| import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.servlet.Filter; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.boot.autoconfigure.AutoConfiguration; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||
| @@ -25,9 +27,6 @@ import org.springframework.web.filter.CorsFilter; | ||||
| import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; | ||||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||||
|  | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.servlet.Filter; | ||||
|  | ||||
| @AutoConfiguration | ||||
| @EnableConfigurationProperties(WebProperties.class) | ||||
| public class YudaoWebAutoConfiguration implements WebMvcConfigurer { | ||||
| @@ -59,8 +58,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { | ||||
|     } | ||||
|  | ||||
|     @Bean | ||||
|     public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService apiErrorLogFrameworkService) { | ||||
|         return new GlobalExceptionHandler(applicationName, apiErrorLogFrameworkService); | ||||
|     @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | ||||
|     public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogApi apiErrorLogApi) { | ||||
|         return new GlobalExceptionHandler(applicationName, apiErrorLogApi); | ||||
|     } | ||||
|  | ||||
|     @Bean | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import cn.hutool.core.map.MapUtil; | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.hutool.extra.servlet.JakartaServletUtil; | ||||
| import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; | ||||
| import cn.iocoder.yudao.framework.common.exception.ServiceException; | ||||
| import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| @@ -14,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||||
| import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||||
| import com.fasterxml.jackson.databind.exc.InvalidFormatException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| @@ -40,12 +40,7 @@ import java.time.LocalDateTime; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN; | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.METHOD_NOT_ALLOWED; | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_FOUND; | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; | ||||
| import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.*; | ||||
|  | ||||
| /** | ||||
|  * 全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 | ||||
| @@ -65,7 +60,7 @@ public class GlobalExceptionHandler { | ||||
|     @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | ||||
|     private final String applicationName; | ||||
|  | ||||
|     private final ApiErrorLogFrameworkService apiErrorLogFrameworkService; | ||||
|     private final ApiErrorLogApi apiErrorLogApi; | ||||
|  | ||||
|     /** | ||||
|      * 处理所有异常,主要是提供给 Filter 使用 | ||||
| @@ -288,7 +283,7 @@ public class GlobalExceptionHandler { | ||||
|             // 初始化 errorLog | ||||
|             buildExceptionLog(errorLog, req, e); | ||||
|             // 执行插入 errorLog | ||||
|             apiErrorLogFrameworkService.createApiErrorLog(errorLog); | ||||
|             apiErrorLogApi.createApiErrorLogAsync(errorLog); | ||||
|         } catch (Throwable th) { | ||||
|             log.error("[createExceptionLog][url({}) log({}) 发生异常]", req.getRequestURI(),  JsonUtils.toJsonString(errorLog), th); | ||||
|         } | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.infra.api.logger; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||||
|  | ||||
| import jakarta.validation.Valid; | ||||
| import org.springframework.scheduling.annotation.Async; | ||||
|  | ||||
| /** | ||||
|  * API 访问日志的 API 接口 | ||||
| @@ -18,4 +19,14 @@ public interface ApiAccessLogApi { | ||||
|      */ | ||||
|     void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); | ||||
|  | ||||
|     /** | ||||
|      * 【异步】创建 API 访问日志 | ||||
|      * | ||||
|      * @param createDTO 访问日志 DTO | ||||
|      */ | ||||
|     @Async | ||||
|     default void createApiAccessLogAsync(ApiAccessLogCreateReqDTO createDTO) { | ||||
|         createApiAccessLog(createDTO); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.infra.api.logger; | ||||
| import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||||
|  | ||||
| import jakarta.validation.Valid; | ||||
| import org.springframework.scheduling.annotation.Async; | ||||
|  | ||||
| /** | ||||
|  * API 错误日志的 API 接口 | ||||
| @@ -18,4 +19,14 @@ public interface ApiErrorLogApi { | ||||
|      */ | ||||
|     void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); | ||||
|  | ||||
|     /** | ||||
|      * 【异步】创建 API 异常日志 | ||||
|      * | ||||
|      * @param createDTO 异常日志 DTO | ||||
|      */ | ||||
|     @Async | ||||
|     default void createApiErrorLogAsync(ApiErrorLogCreateReqDTO createDTO) { | ||||
|         createApiErrorLog(createDTO); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV