创建一个自定义的 Spring Boot Starter,用于提供简单的 REST API 日志记录功能。这个 starter 将使用 spring-boot-starter-logging
依赖,并添加一些额外的配置。
首先,我们需要创建一个新的 Maven项目,并设置项目的名称、组织和版本。例如:
groupId: com.example
artifactId: api-log-spring-boot-starter
version: 0.0.1-SNAPSHOT
在你的 IDE 中创建这个新项目并确保选择了 Java 和 Spring Boot 版本(推荐使用最新稳定版)。
为了创建一个 Spring Boot Starter,你需要在 pom.xml
文件(对于 Maven)或 build.gradle
文件(对于 Gradle)中添加 Spring Boot 的 BOM(Bill of Materials)依赖。这将帮助你管理 Spring Boot 及其相关库的版本。
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
接下来,我们创建一个名为 ApiLogAutoConfiguration
的自动配置类,该类负责配置我们的 starter 提供的功能。在这个例子中,我们将配置一个简单的日志处理器,用于记录所有 API 请求和响应。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(ApiLogProperties.class)
public class ApiLogAutoConfiguration {
private static final Log logger = LogFactory.getLog(ApiLogAutoConfiguration.class);
@Autowired
private ApiLogProperties properties;
@Bean
public FilterRegistrationBean<ApiLoggingFilter> loggingFilter() {
FilterRegistrationBean<ApiLoggingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new ApiLoggingFilter(properties));
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Component
@Order(1)
public class ApiLoggingFilter implements Filter {
private static final Log logger = LogFactory.getLog(ApiLoggingFilter.class);
private ApiLogProperties properties;
public ApiLoggingFilter(ApiLogProperties properties) {
this.properties = properties;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
long startTime = System.currentTimeMillis();
// Process the request and get the response
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
if (properties.isEnabled()) {
Path logFilePath = Paths.get(properties.getLogFile());
Files.createDirectories(logFilePath.getParent());
System.out.println(logFilePath.toFile()+"--------------------");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFilePath.toFile(), true))) {
writer.write("API Request: " + httpServletRequest.getRequestURI() + ", Response Status: " + httpServletResponse.getStatus() + ", Elapsed Time: " + elapsedTime + "ms\n");
} catch (IOException e) {
logger.error("Error writing to log file: " + properties.getLogFile(), e);
}
}
}
}
上面的代码创建了一个名为 ApiLoggingFilter
的过滤器,并将其注册到所有的 URL 路径下。这个过滤器将捕获所有的 HTTP 请求和响应,并将它们记录到日志文件中。
为了让 Spring Boot 自动识别和加载我们的自动配置类,我们需要在 META-INF/spring.factories
文件中指定它们。创建一个名为 spring.factories
的文件,并将其放在项目的 src/main/resources/META-INF
目录下。添加以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.apilogspringbootstarter.autoconfigure.ApiLogAutoConfiguration
为了允许用户自定义日志行为,我们可以创建一个名为 ApiLogProperties
的类来存储相关的属性。这些属性可以在应用程序的 application.yml
或 application.properties
文件中进行配置。
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "api.log")
public class ApiLogProperties {
private boolean enabled = true;
private String logFile;
// getters and setters
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getLogFile() {
return logFile;
}
public void setLogFile(String logFile) {
this.logFile = logFile;
}
}
现在,你可以创建一个简单的 Spring Boot 应用程序来测试你的自定义 starter。在测试应用的 pom.xml
或 build.gradle
文件中添加对自定义 starter 的依赖:
Maven:
<dependency>
<groupId>com.example</groupId>
<artifactId>api-log-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
运行测试应用程序,确保你的 starter 正确地提供了所需的功能。
最后,你可以使用 Maven 或 Gradle 来构建和发布你的自定义 starter 到 Maven 中央仓库或其他私有仓库。
通过以上步骤,你应该已经成功地创建了一个自定义的 Spring Boot Starter,用于提供简单的 REST API 日志记录功能。这个starter可以根据你的需求扩展,添加更多功能或者集成其他库。在实际项目中,你可能需要考虑更多的细节,比如错误处理、日志记录、性能优化等。