首页 > Java > java教程 > 正文

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

心靈之曲
发布: 2024-10-26 11:33:24
原创
1135人浏览过

如何在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;

@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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号