本站资源收集于互联网,不提供软件存储服务,每天免费更新优质的软件以及学习资源!

如何在SpringBoot2中使用Log4j2动态记录日志并根据API接口路径保存日志文件?

网络教程 app 1℃

如何在SpringBoot2中使用Log4j2动态记录日志并根据API接口路径保存日志文件

如何在 springboot2 中使用 log4j2 动态记录日志,并将日志根据 api 接口路径,保存到对应路径的文件中?

问题描述:

需要根据 api 接口路径动态创建日志文件,并保存到对应路径中。例如:

/paypage/createorder/addsave 请求保存到 /logs/paypage/createorder/addsave/yyyy-mm-dd.log/merchant/goodlist/getlistbyquery?currentpage=1&size=10 请求保存到 /logs/merchant/goodlist/getlistbyquery/yyyy-mm-dd.log

已尝试方法和遇到的问题:

通过 system.setproperty(“log4ffile”, “runtimetest.log”) 动态设置日志文件名,但无法获取 api 接口地址。在拦截器中动态设置 log4ffile 也失败。

解决思路:

采用 log4j2 的 routingappender,结合 threadcontext 设置路由键, 根据不同的路由键动态创建不同的 appender,再根据接口路径动态设置路由键。

具体配置:

log4j2-spring.xml 配置文件:

<?xml version="1.0" encoding="utf-8"?><configuration status="debug" monitorinterval="5"> <appenders> <routing name="routing"><routes pattern="${ctx:routingkey}"> <route> <rollingfile name="rolling-${ctx:routingkey}" filename="logs/${ctx:routingkey}/${date:yyyy-mm}.log" filepattern="logs/${date:yyyy-mm}/${ctx:routingkey}-other-%d{yyyy-mm-dd}-%i.log.gz"><patternlayout> <pattern>%d{iso8601} [%t] %p %c{3} – %m%n</pattern></patternlayout><policies> <timebasedtriggeringpolicy interval="6" modulate="true"/> <sizebasedtriggeringpolicy size="10 mb"/></policies> </rollingfile> </route></routes> </routing> </appenders> <loggers> <root level="info"><appenderref ref="routing"/> </root> </loggers></configuration>

拦截器:

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.core.ContextDataInjector;import org.apache.logging.log4j.core.LoggerContext;import org.apache.logging.log4j.core.context.ContextSelector;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) { String requestURI = request.getRequestURI(); ContextSelector selector = ContextSelector.getContextSelector(); LoggerContext context = (LoggerContext) selector.getContext(); ContextDataInjector injector = context.getDataInjector(); injector.put("ROUTINGKEY", requestURI); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { ContextSelector selector = ContextSelector.getContextSelector(); LoggerContext context = (LoggerContext) selector.getContext(); ContextDataInjector injector = context.getDataInjector(); injector.remove("ROUTINGKEY"); }}

完成以上配置后,系统会根据 api 接口路径动态创建对应的日志文件,并且记录日志。

以上就是如何在SpringBoot2中使用Log4j2动态记录日志并根据API接口路径保存日志文件?的详细内容,更多请关注范的资源库其它相关文章!

转载请注明:范的资源库 » 如何在SpringBoot2中使用Log4j2动态记录日志并根据API接口路径保存日志文件?

喜欢 (0)