为每条日志消息添加自定义值

Add custom value to every log message

假设我有一个端点 /user/{user_id}/foo 的 REST API。 现在,当它被调用时,我希望来自处理此请求的所有日志都包含有关 {user_id} 的信息。是否可以在不将 {user_id} 传递给每个方法的情况下实现这一目标?

我正在使用 SLF4j 进行日志记录,我的应用程序基于 Spring Boot。

您也可以为此使用 MDC,请参阅 here。它本质上是一张地图,您只需将上下文信息放入其中(例如用户 ID),然后您就可以在日志布局中使用它。请注意,这仅适用于某些底层框架,例如 logback,其中示例布局模式如下所示:

<Pattern>%X{user_id} %m%n</Pattern>

查看 logback manual 了解更多详细信息。

您可以使用 Logback 的 Mapped Diagnotic Context{user_id} 传播到每个日志消息。

这有两个部分:

  • 将您的 {user_id} 推入 MDC,例如MDC.put("user_id", "Pawel");

  • 在您的日志语句中包含 MDC 条目。您可以通过在日志记录模式中指定它来做到这一点。因此,如果您将用户 ID 存储在名为 "user_id" 的 MDC 条目中,您将设置 logging.pattern.level=user_id:%X{user_id} %5p 以在每个日志事件中包含该条目的值。

更多详情in the docs