package com.iailab.framework.apilog.config; import com.iailab.framework.apilog.core.filter.ApiAccessLogFilter; import com.iailab.framework.apilog.core.interceptor.ApiAccessLogInterceptor; import com.iailab.framework.apilog.core.service.ApiAccessLogFrameworkService; import com.iailab.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; import com.iailab.framework.apilog.core.service.ApiErrorLogFrameworkService; import com.iailab.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; import com.iailab.framework.common.enums.WebFilterOrderEnum; import com.iailab.framework.web.config.WebProperties; import com.iailab.framework.web.config.IailabWebAutoConfiguration; import com.iailab.module.infra.api.logger.ApiAccessLogApi; import com.iailab.module.infra.api.logger.ApiErrorLogApi; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.Filter; @AutoConfiguration(after = IailabWebAutoConfiguration.class) public class IailabApiLogAutoConfiguration 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 请求日志 */ @Bean @ConditionalOnProperty(prefix = "iailab.access-log", value = "enable", matchIfMissing = true) // 允许使用 iailab.access-log.enable=false 禁用访问日志 public FilterRegistrationBean apiAccessLogFilter(WebProperties webProperties, @Value("${spring.application.name}") String applicationName, ApiAccessLogFrameworkService apiAccessLogFrameworkService) { ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService); return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); } private static FilterRegistrationBean createFilterBean(T filter, Integer order) { FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); bean.setOrder(order); return bean; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new ApiAccessLogInterceptor()); } }