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

如何在Quarkus应用中自定义quarkus-logging-json日志格式化器

在Quarkus中自定义JSON日志的异常字段格式(保留原属性名)

完全可以通过自定义JSON日志提供者来实现你的需求——既把异常转为分隔字符串,又保留exception这个属性名。具体实现方式是重写Quarkus JSON日志的格式化逻辑,替换默认的处理行为。

步骤1:创建自定义JsonProvider

Quarkus的quarkus-logging-json扩展基于SmallRye JSON日志框架,我们可以继承默认的DefaultJsonProvider,重写异常处理方法来控制输出格式和字段名:

import io.quarkus.logging.json.JsonGenerator;
import io.quarkus.logging.json.provider.DefaultJsonProvider;
import java.io.IOException;
import java.util.logging.LogRecord;

public class CustomJsonExceptionProvider extends DefaultJsonProvider {

    @Override
    protected void writeThrowable(JsonGenerator generator, LogRecord record) throws IOException {
        Throwable throwable = record.getThrown();
        if (throwable != null) {
            // 直接写入名为"exception"的字段,值为格式化后的堆栈字符串
            generator.writeStringField("exception", formatThrowableToString(throwable));
        }
    }

    // 自定义异常格式化逻辑,这里用换行分隔堆栈信息,可按需调整
    private String formatThrowableToString(Throwable throwable) {
        StringBuilder sb = new StringBuilder();
        appendThrowableDetails(sb, throwable, "");
        
        return sb.toString().trim();
    }

    private void appendThrowableDetails(StringBuilder sb, Throwable throwable, String prefix) {
        sb.append(prefix).append(throwable.toString()).append("\n");
        for (StackTraceElement element : throwable.getStackTrace()) {
            sb.append(prefix).append("\tat ").append(element.toString()).append("\n");
        }

        Throwable cause = throwable.getCause();
        if (cause != null) {
            sb.append(prefix).append("Caused by: ");
            appendThrowableDetails(sb, cause, prefix);
        }
    }
}

步骤2:配置Quarkus使用自定义Provider

在application.properties中指定自定义Provider的类路径,替换默认实现:

# 控制台JSON日志使用自定义Provider
quarkus.log.console.json.provider=com.your.project.package.CustomJsonExceptionProvider

# 如果同时需要处理文件日志,添加下面的配置
# quarkus.log.file.json.provider=com.your.project.package.CustomJsonExceptionProvider

关键说明

  • 无需再设置quarkus.log.console.json.exception-output-type,自定义Provider已经完全接管了异常字段的输出逻辑。
  • 你可以根据需求修改formatThrowableToString中的格式化规则,比如用分号、空格替代换行,或者调整堆栈信息的输出细节。
  • 确保自定义Provider类在Quarkus的扫描路径下(默认src/main/java下的包都会被自动扫描)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:25:56