2026-10-23 13:42:40
在Spring Boot 2中使用Log4j2动态记录日志并根据API接口路径保存日志文件,可以通过以下步骤实现:
添加Log4j2依赖:在pom.xml中添加Log4j2的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId></dependency>配置Log4j2:创建或修改log4j2-spring.xml配置文件,配置RoutingAppender以根据路由键动态创建日志文件。以下是一个示例配置:
<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN" monitorInterval="30"> <Appenders> <Routing name="Routing"> <Routes pattern="$${ctx:routingKey}"> <Route> <RollingFile name="Rolling-${ctx:routingKey}" fileName="logs/${ctx:routingKey}/${date:yyyy-MM-dd}.log" filePattern="logs/${ctx:routingKey}/${date:yyyy-MM-dd}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="10 MB"/> </Policies> </RollingFile> </Route> </Routes> </Routing> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Routing"/> </Root> </Loggers></Configuration>创建拦截器:创建一个拦截器,在请求处理前设置路由键(即API接口路径),并在请求处理后清除路由键。以下是一个示例拦截器:
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.ThreadContext;import org.springframework.stereotype.Component;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;@Componentpublic class Log4j2Interceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); ThreadContext.put("routingKey", requestURI.replaceAll("/", "_")); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // No action needed } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { ThreadContext.clearAll(); }}注册拦截器:在Spring Boot应用中注册拦截器。创建一个配置类并实现WebMvcConfigurer接口:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebConfig implements WebMvcConfigurer { @Autowired private Log4j2Interceptor log4j2Interceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(log4j2Interceptor); }}使用日志记录:在代码中使用Log4j2记录日志。Log4j2会根据拦截器设置的路由键动态创建日志文件:
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class MyController { private static final Logger logger = LogManager.getLogger(MyController.class); @GetMapping("/example") public String example() { logger.info("This is a log message for the /example endpoint."); return "Example Response"; }}通过以上步骤,Spring Boot 2应用会根据API接口路径动态创建日志文件,并将日志记录到对应的文件中。拦截器在请求处理前设置路由键,Log4j2根据路由键动态选择或创建相应的日志文件。