Spring Boot 2中如何使用Log4j2實現按API接口路徑動態保存日志?

Spring Boot 2中如何使用Log4j2實現按API接口路徑動態保存日志?

spring Boot 2結合log4j2實現API接口路徑動態日志保存

本文介紹如何在spring boot 2應用中利用Log4j2,根據API接口路徑動態生成并保存日志文件。這需要比簡單使用RollingFileAppender更靈活的日志記錄機制。

目標:為每個API接口(例如/paypage/createorder/addsave,/merchant/goodlist/getlistbyquery)創建獨立的日志文件,保存在jar包目錄/logs/接口路徑/yyyy-mm-dd.log下。

問題:直接在main函數或攔截器中修改Log4j2配置文件文件名無效,因為配置文件加載時機過早。

解決方案:使用Log4j2的RoutingAppender。RoutingAppender根據運行時條件將日志路由到不同的Appender。結合ThreadContext,我們可以將API路徑作為路由鍵,動態控制日志文件路徑。

實現步驟:

  1. 配置RoutingAppender: 在log4j-spring.xml中配置RoutingAppender,定義路由規則。規則根據ThreadContext中的鍵值匹配,將日志路由到對應的RollingFileAppender。${ctx:routingkey}獲取運行時動態設置的路由鍵(API路徑)。
<Routing name="routing">   <Routes pattern="${ctx:routingkey}">     <Route>       <RollingFile name="rolling-${ctx:routingkey}"                    filename="./logs/${ctx:routingkey}/${date:yyyy-mm-dd}.log"                    filePattern="./logs/${date:yyyy-mm}/${ctx:routingkey}-%d{yyyy-mm-dd}-%i.log.gz">         <PatternLayout pattern="%d{iso8601} [%t] %p %c{3} - %m%n"/>         <Policies>           <TimeBasedTriggeringPolicy interval="1" modulate="true"/>           <SizeBasedTriggeringPolicy size="10MB"/>         </Policies>       </RollingFile>     </Route>   </Routes> </Routing>
  1. 攔截器設置路由鍵: 創建一個攔截器,在preHandle方法中使用ThreadContext.put(“routingkey”, apiPath)設置路由鍵(apiPath為API接口路徑)。在postHandle方法中使用ThreadContext.remove(“routingkey”)清除路由鍵,避免影響后續請求。
public class Log4j2Interceptor implements HandlerInterceptor {     @Override     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {         String apiPath = request.getRequestURI();         ThreadContext.put("ROUTINGKEY", apiPath);         return true;     }      @Override     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {         ThreadContext.remove("ROUTINGKEY");     } }

通過以上步驟,Spring Boot 2應用即可根據API接口路徑動態生成日志文件,實現更精細的日志管理。 請確保日志目錄存在且具有寫入權限。 RoutingAppender的路由規則可根據實際需求調整。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享