Spring Boot 2 中如何使用 Log4j2按API接口路徑動(dòng)態(tài)保存日志?

Spring Boot 2 中如何使用 Log4j2按API接口路徑動(dòng)態(tài)保存日志?

spring Boot 2 與 log4j2:基于 API 接口路徑的動(dòng)態(tài)日志記錄

本文介紹如何在 spring boot 2 應(yīng)用中利用 Log4j2 實(shí)現(xiàn)動(dòng)態(tài)日志記錄,并根據(jù) API 接口路徑將日志保存到指定文件。 目標(biāo)是解決如何將不同 API 接口的日志分別存儲(chǔ)到不同目錄下的問題,例如 /paypage/createorder/addsave 接口的日志應(yīng)保存至 jar包目錄/logs/paypage/createorder/addsave/yyyy-mm-dd.log。

直接修改 Log4j2 配置文件在運(yùn)行時(shí)無效,因?yàn)榕渲梦募ǔT趹?yīng)用啟動(dòng)時(shí)加載。 因此,本文采用 Log4j2 的 RoutingAppender 來解決此問題。 RoutingAppender 允許根據(jù)運(yùn)行時(shí)條件將日志路由到不同的 Appender。

解決方案:結(jié)合 RoutingAppender 和 ThreadContext

我們使用 ThreadContext 在攔截器中設(shè)置上下文變量 routingkey,其值為 API 接口路徑。 RoutingAppender 根據(jù) routingkey 的值將日志路由到不同的 RollingFileAppender。

1. Log4j2 配置 (log4j-spring.xml):

以下是一個(gè) log4j-spring.xml 配置文件片段示例:

<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" />     </Route>   </Routes> </Routing>

2. 攔截器 (Log4j2Interceptor):

攔截器用于獲取 API 接口路徑并將其存儲(chǔ)到 ThreadContext 中。

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); // 注意:此處 key 為 routingkey         return true;     }      @Override     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {         ThreadContext.remove("routingkey");     } }

工作原理:

  • 攔截器在每個(gè)請(qǐng)求前執(zhí)行,獲取請(qǐng)求路徑并將其作為 routingkey 存儲(chǔ)到 ThreadContext。
  • Log4j2 使用 RoutingAppender,根據(jù) ThreadContext 中的 routingkey 選擇對(duì)應(yīng)的 RollingFileAppender。
  • 日志被寫入到根據(jù) routingkey (API 路徑) 動(dòng)態(tài)生成的日志文件中。
  • 攔截器在請(qǐng)求處理后清除 routingkey,避免干擾后續(xù)請(qǐng)求。

注意事項(xiàng):

  • 需要確保 ./logs 目錄存在,并且應(yīng)用有寫入該目錄的權(quán)限。
  • 可以根據(jù)實(shí)際需求調(diào)整日志文件路徑、文件名格式以及 RollingFileAppender 的其他配置參數(shù)。
  • routingkey 的大小寫敏感,請(qǐng)與配置文件中的 pattern 保持一致。

此方法有效地解決了在 Spring Boot 2 中使用 Log4j2 根據(jù) API 接口路徑動(dòng)態(tài)保存日志的問題,實(shí)現(xiàn)了靈活的日志管理。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享