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路徑作為路由鍵,動態控制日志文件路徑。
實現步驟:
- 配置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>
- 攔截器設置路由鍵: 創建一個攔截器,在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