当前位置: 首页 > 知识库问答 >
问题:

如何通过MDC将从JWT获取的用户id添加到后端日志中?

田向荣
2023-03-14

我们有一个带有REST接口的Spring Boot应用程序和一个web客户端。我们使用spring-security和OAuth2.0 JWT令牌进行身份验证。我们正在使用slf4j和sleuth进行日志记录。我们希望在日志中记录当前登录的用户id。技术上,我们希望将用户id添加到服务器应用程序的映射诊断上下文(MDC)中。

spring.sleuth.baggage.remote-fields=user_id
spring.sleuth.baggage.tag-fields=user_id
spring.sleuth.baggage.correlation-fields=user_id
logging:
  level:
    ROOT: WARN
  pattern:
    console: "[%d] [%t] %highlight(%-5p) %c{10} - %cyan([trace=%X{X-B3-TraceId:-} span=%X{X-B3-SpanId:-} user=%X{user_id:-}]) %m%n"
    null
package net.company.common.service;

import brave.baggage.BaggageField;
import brave.baggage.BaggagePropagation;
import brave.baggage.BaggagePropagationConfig;
import brave.baggage.BaggagePropagationCustomizer;
import brave.internal.baggage.BaggageContext;
import net.company.common.service.CommonServiceConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@ComponentScan
@Import({CommonServiceConfig.class})
public class ServiceConfig {

  @Bean
  BaggagePropagationConfig.SingleBaggageField singleBaggageField() {
    BaggagePropagationConfig.SingleBaggageField field = BaggagePropagationConfig.SingleBaggageField.newBuilder(BaggageField.create("user_id")).build();
    field.field().updateValue("user_12345"); // set only dummy value for debug
    return field;
  }

}

可以手动实现这样的MDC,请参阅https://www.baeldung.com/mdc-in-log4j-2-logback。但由于这是容易出错的,我们希望避免它,例如,上下文清理必须做正确的。

如何使用sleuth/brave将来自JWT的用户id添加到MDC以进行服务器端日志记录?

共有1个答案

戚勇
2023-03-14

我在用

spring boot version: 2.1.2.RELEASE
spring cloud version: Greenwich.RELEASE

并且可以使用以下属性进行配置

spring.sleuth.propagation-keys=user_id
spring.sleuth.log.slf4j.whitelisted-mdc-keys=user_id
 类似资料:
  • 我正在尝试将一个值设置为MDC,以便在有日志的情况下显示在每个日志行中。如果kafka producer中有info(“”),那么日志就不会显示我之前为MDC添加的值。 我有一个拦截器来为correlationId设置“默认值” 我设置了 MDC 相关 Id 值,当它进入控制器时。 仅用于Kafka日志不包括之前添加的 MDC 消息 2022-06-08 10:15:31.616 INFO { c

  • 我试图添加额外的行李到HTTP服务器上的现有跨度,我想添加一个路径变量到跨度,从日志MDC访问,并通过超文本传输协议或kafka在电线上传播到下一个服务器。 我的设置:春云侦探霍克斯顿。SR5和Spring启动2.2.5 我尝试添加以下设置和配置: 并添加了http拦截器: 和http筛选器以影响当前范围(根据spring文档) 问题是日志不包含我的自定义上下文id,上下文类型,虽然是在span上

  • 当我尝试console appender并尝试打印该字段时,就像下面的示例一样,它起作用了。 你能告诉我我在udp appender上做错了什么吗?谢谢你的忠告。

  • 我在我的Spring启动应用程序中使用了开放遥测java自动检测。有没有办法让应用程序日志成为创建的跨度的一部分? 我的自动配置设置如下:

  • 是否有方法获取将文档添加到集合后生成的文档id? 如果我将文档添加到代表社交媒体软件中“帖子”的集合中,我想获取该文档ID并将其用作不同集合中另一个文档中的字段。 如果我无法获取添加文档后生成的文档Id,我是否应该计算一个随机字符串,并在创建文档时提供Id?这样我就可以使用与其他文档中的字段相同的字符串了? 快速结构示例:

  • 我正在尝试将“Nuxt身份验证模块”集成到我的Nuxt应用程序中。 https://auth.nuxtjs.org/ 我已经配置了我的代理 https://auth.nuxtjs.org/schemes/local.html 我的'Login'endpoint工作正常,我将'propertyName'设置为'access_token',因为这是我的令牌值所在的位置。我看到“Vuex”将我的“Log