如何在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
相关产品推荐
相关产品推荐

