📜  log4j 与 Spring Boot RESTful 服务 - Java (1)

📅  最后修改于: 2023-12-03 14:44:03.606000             🧑  作者: Mango

log4j 与 Spring Boot RESTful 服务

介绍

在使用Spring Boot构建RESTful服务时,我们通常需要记录日志以便追踪问题。其中使用log4j是最常见的方法之一。本篇文章将介绍如何在Spring Boot项目中集成log4j,并记录RESTful服务的日志。

集成log4j

首先,我们需要在Spring Boot项目中添加log4j的依赖:

<dependency> 
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-log4j</artifactId> 
  <version>2.2.6.RELEASE</version> 
</dependency>

然后,我们需要创建log4j.properties文件,并添加以下内容:

# Define the root logger with default log level and output file
log4j.rootLogger=INFO, file
# Define the file appender
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/spring-boot-application.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p (%F:%L) - %m%n

以上配置会记录INFO级别的日志,并将日志输出到/var/log/spring-boot-application.log文件中。

记录RESTful服务的日志

我们通常需要记录RESTful服务的请求和响应信息。为此,我们可以在Spring Boot项目中添加一个拦截器,该拦截器能够记录HTTP请求和响应的信息,并将其写入日志文件中。

以下是一个示例拦截器:

public class LoggingInterceptor implements HandlerInterceptor {
 
    private static final Logger LOGGER = Logger.getLogger(LoggingInterceptor.class);
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        LOGGER.info("Request URI: " + request.getRequestURI());
        LOGGER.info("Request Headers: " + Collections.list(request.getHeaderNames()).stream()
				.map(headerName -> headerName + ":" + request.getHeader(headerName))
				.collect(Collectors.joining(", ")));
        LOGGER.info("Request Body: " + request.getReader().lines().collect(Collectors.joining(System.lineSeparator())));
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        LOGGER.info("Response Status: " + response.getStatus());
        LOGGER.info("Response Body: " + response.getContentType() + " " + response.getContentLength() + " bytes");
    }
}

该拦截器会在请求到达处理程序之前记录请求信息,并在请求完成之后记录响应信息。

最后,我们需要将该拦截器添加到Spring Boot项目中。以下是一个示例配置:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor());
    }
 
}
结论

本篇文章介绍了如何在Spring Boot项目中集成log4j,并记录RESTful服务的日志。同时,我们还介绍了如何编写一个拦截器来记录HTTP请求和响应的信息。这些技术将帮助我们更好地跟踪和排查问题。