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

如何在自定义Quarkus扩展中硬编码覆盖配置禁用原JSON日志扩展?

解决Quarkus自定义JSON日志扩展的多格式化器冲突问题

以下几种硬编码禁用原quarkus-logging-json扩展配置的方法都可行:

方法1:在扩展部署阶段强制覆盖配置默认值

在自定义扩展的部署模块中编写Build Step处理器,通过Quarkus配置API强制将目标配置的默认值设为false,代码示例:

import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.ConfigurationBuildItem;

class CustomJsonLogProcessor {
    @BuildStep
    ConfigurationBuildItem overrideJsonLoggingConfig() {
        return ConfigurationBuildItem.builder()
                .overrideConfigValue("quarkus.console.json.enable", "false")
                .overrideConfigValue("quarkus.file.json.enable", "false")
                .build();
    }
}

这种方式在构建阶段就替换掉目标配置的默认值,优先级高于用户的application.properties配置;如果需要允许用户手动开启,可改为仅设置默认值而非强制覆盖。

方法2:添加高优先级自定义配置源

在自定义扩展的运行时模块中实现ConfigSource,让它的优先级高于默认配置源,强制返回目标配置的false值:

import io.smallrye.config.ConfigSource;
import java.util.HashMap;
import java.util.Map;

public class DisableDefaultJsonLogConfigSource implements ConfigSource {
    @Override
    public Map<String, String> getProperties() {
        Map<String, String> props = new HashMap<>();
        props.put("quarkus.console.json.enable", "false");
        props.put("quarkus.file.json.enable", "false");
        return props;
    }

    @Override
    public String getValue(String propertyName) {
        return getProperties().get(propertyName);
    }

    @Override
    public String getName() {
        return "CustomJsonLogDisabler";
    }

    // 设置高于默认配置源的优先级,确保配置被覆盖
    @Override
    public int getOrdinal() {
        return 200; // 默认配置源ordinal为100,自定义值设更高即可
    }
}

随后在META-INF/services/io.smallrye.config.ConfigSource文件中注册该类,文件内容为该类的全限定名,运行时会优先加载此配置源的设置。

方法3:运行时初始化阶段直接覆盖配置

如果无需兼容用户自定义配置,可在自定义扩展的运行时初始化类中通过ConfigProvider修改配置(此方式不如前两种符合Quarkus扩展规范,仅作备选):

import io.smallrye.config.ConfigProvider;
import io.smallrye.config.SmallRyeConfig;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.annotation.PostConstruct;

@ApplicationScoped
public class CustomJsonLogInitializer {
    @PostConstruct
    public void init() {
        SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
        config.getConfigSources().stream()
                .filter(cs -> cs.getName().contains("applicationConfig"))
                .findFirst()
                .ifPresent(cs -> {
                    cs.setValue("quarkus.console.json.enable", "false");
                    cs.setValue("quarkus.file.json.enable", "false");
                });
    }
}

通过@PostConstruct注解让初始化逻辑在应用启动时执行。

以上方法均可解决多格式化器冲突的报错问题,推荐优先使用前两种方案,更贴合Quarkus扩展的开发规范。

内容的提问来源于stack exchange,提问作者Sof42lxca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:05:41