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

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 配置文件片段示例:

                  

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接口路径动态保存日志?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/173174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 03:33:55
下一篇 2025年11月1日 03:39:13

相关推荐

  • Go time.Parse 函数布局字符串的奥秘与正确用法

    本文深入探讨 go 语言 `time.parse` 函数中布局字符串(layout string)的特殊机制。它并非传统的格式化字符串,而是基于一个固定的参考时间(`2006-01-02 15:04:05.000000000 -0700 mst`)来识别日期时间组件。文章将详细解释布局字符串中数字和…

    2025年12月16日
    000
  • Golang如何使用time处理时间与日期_Golang time时间日期操作实践详解

    Go语言通过time包提供时间获取、格式化、解析、计算和时区操作。使用time.Now()获取当前时间,可提取年、月、日、时、分、秒、星期等信息;时间格式化采用参考时间“2006-01-02 15:04:05”作为布局模板,通过t.Format()格式化输出,time.Parse()或time.Pa…

    2025年12月16日
    000
  • Go html/template 中 time.Time 类型格式化指南

    在 go 语言的 `html/template` 模板中,直接格式化 `time.time` 类型是一个常见需求。本文将详细介绍如何在不进行复杂类型转换的情况下,利用模板引擎的内置能力,直接在 html 模板中对 `time.time` 对象进行灵活的日期和时间格式化,从而避免 go 代码中的繁琐处…

    2025年12月16日 好文分享
    000
  • Go html/template 中 time.Time 格式化显示指南

    本文详细介绍了在 go 语言的 `html/template` 模板中如何高效且灵活地格式化 `time.time` 类型数据。通过直接在模板内调用 `time.time` 对象的 `format` 方法,开发者可以避免复杂的类型转换问题,并以多种自定义格式呈现日期和时间信息,极大提升了模板渲染的便…

    2025年12月16日
    000
  • 在 Go html/template 中高效格式化 time.Time 类型数据

    本文探讨了在 Go 语言的 `html/template` 模板中如何优雅且高效地格式化 `time.Time` 类型数据。通过利用模板引擎直接调用 `time.Time` 对象的 `Format` 方法,开发者可以避免类型转换问题,轻松实现日期时间的自定义显示,确保数据在前端以期望的格式呈现,提升…

    2025年12月16日
    000
  • Golang如何使用time处理时间和日期

    Go语言中time包用于处理时间与日期,核心功能包括获取当前时间(time.Now())、格式化输出(基于“2006-01-02 15:04:05”模板)、解析字符串(time.Parse)、时间比较与计算(After、Before、Add、Sub)以及定时操作(Sleep、Tick),掌握这些即可…

    2025年12月16日
    000
  • Go语言中探测字符串底层内存共享的方法与风险

    go语言字符串在表面上是值类型且不可变,但其底层数据存储可能存在共享。本文将探讨如何利用`reflect.stringheader`和`unsafe.pointer`技术来检测字符串是否共享同一块底层内存。同时,文章将着重强调该方法属于go语言内部实现细节,不具备可移植性,不推荐在生产环境中使用,并…

    2025年12月16日
    000
  • Go语言XML解析:处理time.Time字段的自定义日期格式

    在go语言中,当使用`encoding/xml`包解析xml数据时,`time.time`字段默认不支持自定义日期格式,导致非标准日期字符串解析失败。本文将详细介绍如何通过实现`xml.unmarshaler`接口,创建一个嵌入`time.time`的自定义类型,从而灵活处理各种自定义日期格式的xm…

    2025年12月16日
    000
  • 使用 Go 语言高效生成大型随机 CSV 测试文件

    本文详细阐述了如何使用 Go 语言高效地生成指定大小(例如 10GB)的随机 CSV 文件,其数据格式为 prefix:username:timestamp, number。通过结合 bufio 包进行缓冲写入、math/rand 包生成随机数据以及 time 包处理时间,本教程提供了一个实用的代码…

    2025年12月16日
    000
  • Go 语言中日期与时间的精确处理机制

    Go 语言通过其内置的 time 包提供了一套强大且精确的日期时间处理机制。它将时间表示为具有纳秒精度的瞬时点,不包含闰秒,从而简化了内部计算。Go 依赖 IANA 时区数据库来管理复杂的时区和夏令时规则,确保了全球范围内的准确时间解释。其核心 Time 结构体封装了秒、纳秒偏移量以及地理位置信息,…

    2025年12月16日
    000
  • Go 语言日期与时间处理:time 包详解

    Go 语言通过其内置的 time 包提供一套强大且精确的日期与时间处理机制。它将时间表示为具有纳秒精度的瞬间,并明确不包含闰秒。Go 依赖 IANA 时区数据库处理时区和夏令时,其核心 Time 结构体内部存储秒、纳秒偏移量以及关联的时区信息,旨在提供一个稳定、可靠的时间管理方案,有效应对日期时间处…

    2025年12月16日
    000
  • Golang time时间操作与格式化实践

    Go语言中time包通过time.Time类型处理时间,使用time.Now()获取当前时间并用Format按“2006-01-02 15:04:05”参考时间格式化,Parse解析字符串,Add、Sub进行时间计算,In切换时区,建议统一UTC存储时间。 Go语言中的time包提供了丰富的时间处理…

    2025年12月16日
    000
  • Go语言XML解析教程:高效处理多项数据与字段导出策略

    本教程深入探讨Go语言encoding/xml包在解析包含多项数据的XML时遇到的常见问题,特别是关于结构体字段导出(大小写)的限制。我们将详细解释xml.Unmarshal函数的工作原理,并提供一个实用的解决方案,通过结合导出字段和xml标签来确保数据正确反序列化。文章包含示例代码、关键注意事项及…

    2025年12月16日
    000
  • Golang适配器模式第三方接口兼容示例

    适配器模式通过定义统一SMSSender接口,为阿里云和腾讯云短信服务分别实现AliyunAdapter和TencentAdapter适配器,使不同SDK接口标准化,业务层可透明切换服务商,提升扩展性与维护性。 在使用 Golang 开发项目时,经常会对接第三方服务,比如支付、短信、物流等。不同第三…

    2025年12月16日
    000
  • Go语言日志滚动方案:实现文件大小限制的日志切割

    Go语言标准库 log 包提供了一套简单的日志记录方案,但在实际应用中,它缺少一项关键功能:日志滚动。这意味着日志文件会无限增长,最终可能耗尽磁盘空间或影响系统性能。本文将深入探讨如何在Go语言中实现日志滚动,特别是基于文件大小限制的日志切割。 Go标准库日志的局限性 Go语言标准库 log 包的优…

    2025年12月16日
    000
  • Go语言中字符串到时间对象的转换:time.Parse() 深度解析

    本文旨在详细讲解Go语言中如何将日期字符串转换为time.Time类型。我们将重点介绍time.Parse()函数的使用方法,特别是其核心参数——格式化字符串的构造规则,并通过具体代码示例展示如何安全高效地完成字符串到时间对象的转换。 在go语言的开发实践中,我们经常会遇到需要将各种格式的日期字符串…

    2025年12月16日
    000
  • Go语言:解析Epoch毫秒时间戳字符串的实用指南

    在Go语言中,直接解析形如“Epoch毫秒数”的时间戳字符串并非time包的内置功能。本教程将详细介绍如何通过strconv.ParseInt将字符串转换为整数,并结合time.Unix函数,将其准确转换为time.Time对象,从而实现后续的格式化输出,弥补标准库在特定时间格式解析上的不足。 挑战…

    2025年12月15日
    000
  • Go语言:将毫秒级Unix纪元时间戳字符串转换为time.Time对象

    本教程探讨Go语言中解析毫秒级Unix纪元时间戳字符串的有效方法。鉴于time包的Parse函数不直接支持此格式,我们将演示如何将毫秒字符串手动转换为整数,然后利用time.Unix函数构建time.Time对象,从而实现时间数据的精确处理与格式化。 在go语言中处理时间数据时,我们经常会遇到来自不…

    2025年12月15日
    000
  • 使用 Go 语言构建上下文无关文法 (CFG) 解析器

    本文将指导您如何使用 Go 语言构建上下文无关文法 (CFG) 解析器。goyacc 是一个非常有用的工具,虽然它本身不是一个库,而是一个代码生成器,但它提供了一种标准且高效的方式来处理 CFG 解析问题。 goyacc 简介 goyacc 是 Go 语言自带的 Yacc (Yet Another …

    2025年12月15日
    000
  • Golangtime包日期时间操作技巧

    Go语言time包使用“2006-01-02 15:04:05”格式化时间,通过time.Now()获取当前时间,Parse解析字符串,Add/Sub进行时间计算,Sleep和Ticker实现休眠与定时任务。 Go语言的 time 包提供了丰富的日期和时间处理功能,掌握一些常用技巧可以大幅提升开发效…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信