You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现动态字段注入:

  1. 创建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);
        }
    }
}
  1. 在Keycloak配置文件(如application.properties)中指定自定义Provider:
quarkus.log.json.provider=com.your.package.CustomDynamicLogProvider
  1. 将编译后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:16:15