如何在Keycloak日志中添加traceId?配置问题求助
Keycloak日志显示TraceId问题解决
问题诊断
从日志输出看,spanId和traceId字段为空,说明OpenTelemetry的上下文没有被注入到日志MDC(映射诊断上下文)中。你的配置存在两个核心问题:
- 选用的
opentelemetry-logback组件不适用于Keycloak 18基于的JBoss Logging框架; - 自定义模块依赖不完整,且未配置上下文传播逻辑。
推荐解决方案(使用OpenTelemetry Java Agent)
这是最简单可靠的方式,Java Agent会自动完成链路追踪的Instrumentation、上下文传播和MDC注入:
1. 下载OpenTelemetry Java Agent
选择与你现有OpenTelemetry版本匹配的Agent(示例为1.9.2版本):
curl -L https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.9.2/opentelemetry-javaagent-all.jar -o opentelemetry-javaagent.jar
2. 修改Keycloak启动参数
启动时添加JVM参数,启用Agent并配置MDC注入:
java -javaagent:/path/to/opentelemetry-javaagent.jar \ -Dotel.traces.exporter=otlp \ -Dotel.metrics.exporter=none \ -Dotel.logs.exporter=none \ -Dotel.resource.attributes=service.name=keycloak \ -Dotel.instrumentation.jboss-logging.mdc.enabled=true \ -jar keycloak-18.0.0/bin/standalone.sh -c standalone-ha.xml
-Dotel.instrumentation.jboss-logging.mdc.enabled=true:关键参数,自动将trace_id和span_id注入到JBoss Logging的MDC中,与你日志格式中的变量名完全对应。
3. 优化日志格式(可选)
移除格式中未使用的冗余变量,保持简洁:
<formatter name="COLOR-PATTERN"> <pattern-formatter pattern="spanId: %X{span_id} traceId: %X{trace_id} %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] %s%e%n"/> </formatter>
备选方案(手动配置模块,不推荐)
如果必须手动配置模块,需补充依赖并完善上下文配置:
1. 完善自定义模块
补充缺失的OpenTelemetry核心依赖,并添加模块间依赖声明:
<module name="io.opentelemetry.opentelemetry-logback" xmlns="urn:jboss:module:1.0"> <resources> <resource-root path="opentelemetry-logback-1.0-1.9.2.jar"/> <resource-root path="opentelemetry-api-1.9.1.jar"/> <resource-root path="opentelemetry-context-1.9.1.jar"/> <resource-root path="opentelemetry-instrumentation-api-1.19.2.jar"/> <resource-root path="opentelemetry-sdk-1.9.1.jar"/> <resource-root path="opentelemetry-semconv-1.9.1.jar"/> </resources> <dependencies> <module name="org.jboss.logging"/> <module name="org.slf4j"/> <module name="javax.api"/> </dependencies> </module>
2. 初始化OpenTelemetry上下文
需要编写自定义启动类,手动初始化TracerProvider并确保上下文在请求线程中传播,这一步需要打包为Keycloak扩展部署,复杂度较高。
验证
启动Keycloak后发起认证请求,查看日志即可看到填充完整的spanId和traceId。
内容的提问来源于stack exchange,提问作者Rasool Ghafari
相关产品推荐
相关产品推荐

