我们说我有一个端点为/user/{user_id}/foo
的REST API。
现在,当它被调用时,我希望处理此请求的所有日志都包含有关{user_id}
的信息。是否有可能在不将{user_id}
传递给每个方法的情况下实现这一目标?
我使用SLF4j进行日志记录,我的应用程序基于Spring Boot。
答案 0 :(得分:2)
您也可以使用MDC,请参阅here。它本质上是一张地图,您只需将上下文信息放入其中(例如用户ID),然后就可以在日志布局中使用它。请注意,这仅适用于某些底层框架,如logback,其中示例布局模式如下所示:
<Pattern>%X{user_id} %m%n</Pattern>
查看logback manual了解详情。
答案 1 :(得分:1)
您可以使用Logback的Mapped Diagnotic Context将{user_id}
传播到每条日志消息。
这有两个部分:
将您的{user_id}
推送到MDC,例如MDC.put("user_id", "Pawel");
在日志语句中包含MDC条目。您可以通过在日志模式中指定它来执行此操作。因此,如果将用户标识存储在名为"user_id"
的MDC条目中,则应将logging.pattern.level=user_id:%X{user_id} %5p
设置为在每个日志事件中包含该条目的值。
更多详情in the docs