mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 04:08:43 +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);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user