首页 > Java > java教程 > 正文

Spring Boot 2 中如何使用 Log4j2按API接口路径动态保存日志?

心靈之曲
发布: 2025-03-01 20:50:01
原创
771人浏览过

spring boot 2 中如何使用 log4j2按api接口路径动态保存日志?

Spring Boot 2 与 Log4j2:基于 API 接口路径的动态日志记录

本文介绍如何在 Spring Boot 2 应用中利用 Log4j2 实现动态日志记录,并根据 API 接口路径将日志保存到指定文件。 目标是解决如何将不同 API 接口的日志分别存储到不同目录下的问题,例如 /paypage/createorder/addsave 接口的日志应保存至 jar包目录/logs/paypage/createorder/addsave/yyyy-mm-dd.log。

直接修改 Log4j2 配置文件在运行时无效,因为配置文件通常在应用启动时加载。 因此,本文采用 Log4j2 的 RoutingAppender 来解决此问题。 RoutingAppender 允许根据运行时条件将日志路由到不同的 Appender。

解决方案:结合 RoutingAppender 和 ThreadContext

我们使用 ThreadContext 在拦截器中设置上下文变量 routingkey,其值为 API 接口路径。 RoutingAppender 根据 routingkey 的值将日志路由到不同的 RollingFileAppender。

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

以下是一个 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 接口路径并将其存储到 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");
    }
}
登录后复制

工作原理:

  • 拦截器在每个请求前执行,获取请求路径并将其作为 routingkey 存储到 ThreadContext。
  • Log4j2 使用 RoutingAppender,根据 ThreadContext 中的 routingkey 选择对应的 RollingFileAppender。
  • 日志被写入到根据 routingkey (API 路径) 动态生成的日志文件中。
  • 拦截器在请求处理后清除 routingkey,避免干扰后续请求。

注意事项:

  • 需要确保 ./logs 目录存在,并且应用有写入该目录的权限。
  • 可以根据实际需求调整日志文件路径、文件名格式以及 RollingFileAppender 的其他配置参数。
  • routingkey 的大小写敏感,请与配置文件中的 pattern 保持一致。

此方法有效地解决了在 Spring Boot 2 中使用 Log4j2 根据 API 接口路径动态保存日志的问题,实现了灵活的日志管理。

以上就是Spring Boot 2 中如何使用 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号