Keycloak Quarkus JSON日志:动态字段与堆栈格式化问题求助
解决方案
问题1:MDC字段扁平化与动态自定义字段处理
MDC扁平化修复
你之前使用的quarkus.log.json.fields.mdc.flat-fields=true配置路径有误,Quarkus logging-json扩展的正确配置项是:
quarkus.log.json.mdc.flat=true
该配置会直接将MDC中的键值对扁平化到JSON根节点,而非嵌套在mdc子对象中。如果你的Keycloak版本低于19(基于Quarkus 2.x),建议升级到较新版本以支持该配置。
动态添加自定义字段(如ipAddress)
Keycloak完全支持CDI,你可以通过自定义JsonProvider实现动态字段注入:
- 创建CDI bean实现
io.quarkus.logging.json.JsonProvider:
import io.quarkus.logging.json.JsonProvider; import jakarta.enterprise.context.ApplicationScoped; import jakarta.servlet.http.HttpServletRequest; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.slf4j.MDC; import java.util.Map; @ApplicationScoped public class CustomDynamicLogProvider implements JsonProvider { @Override public void writeToJson(Map<String, Object> jsonMap) { // 从请求上下文获取客户端IP HttpServletRequest request = ResteasyProviderFactory.getContextData(HttpServletRequest.class); if (request != null) { jsonMap.put("ipAddress", request.getRemoteAddr()); } // 手动扁平化MDC(若配置不生效时兜底) Map<String, String> mdcData = MDC.getCopyOfContextMap(); if (mdcData != null) { jsonMap.putAll(mdcData); } } }
- 在Keycloak配置文件(如
application.properties)中指定自定义Provider:
quarkus.log.json.provider=com.your.package.CustomDynamicLogProvider
- 将编译后的jar包放入Keycloak的
providers目录,重启Keycloak生效。
问题2:堆栈跟踪JSON格式化修复
不要使用自定义KC_LOG_CONSOLE_FORMAT拼接JSON,这会破坏异常堆栈的序列化结构。直接使用Quarkus logging-json的原生配置控制堆栈输出:
配置选项1:堆栈转为单行字符串
quarkus.log.console.output=json # 将堆栈转为单行,替换换行符为\n quarkus.log.json.exception-output-type=formatted # 自定义堆栈字段名(可选) quarkus.log.json.fields.exception.name=stackTrace
配置选项2:堆栈转为数组元素
quarkus.log.console.output=json # 将堆栈每一行作为数组元素 quarkus.log.json.exception-output-type=array quarkus.log.json.fields.exception.name=stackTrace
以上配置会自动将异常堆栈序列化为合法的JSON格式,避免换行符导致的结构错误。
内容的提问来源于stack exchange,提问作者MrRobot9
相关产品推荐
相关产品推荐

