
如何在 springboot2 中使用 log4j2 动态记录日志,并将日志根据 api 接口路径,保存到对应路径的文件中?
问题描述:
需要根据 api 接口路径动态创建日志文件,并保存到对应路径中。例如:
已尝试方法和遇到的问题:
解决思路:
采用 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;
@Component
public 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接口路径保存日志文件?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号