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

log4j2的objectMessageAsJsonObject配置在WebFlux(Netty)环境不生效

Log4j2 JsonLayout objectMessageAsJsonObject 配置在Netty环境失效解决方案

失效根因

Spring WebFlux 默认依赖的 Reactor 框架在 Netty 运行环境下,会对异步线程产生的日志消息做预处理,在消息传递到 Log4j2 内核前就自动调用对象的toString()方法转为字符串格式,导致objectMessageAsJsonObject配置无法识别到原始对象,最终输出转义后的字符串。Tomcat 环境下不会触发 Reactor 的这套日志预处理逻辑,因此配置可以正常生效。

修复步骤

1. 禁用 Reactor 日志自动格式化

在项目启动类的SpringApplication.run执行前添加如下系统属性配置:

public static void main(String[] args) {
    // 禁用Reactor自动格式化日志消息
    System.setProperty("reactor.logging.fallback", "JDK");
    System.setProperty("reactor.operator.debug.checkpoint.logger.enable", "false");
    SpringApplication.run(Application.class, args);
}

也可以直接添加JVM启动参数生效:

-Dreactor.logging.fallback=JDK -Dreactor.operator.debug.checkpoint.logger.enable=false

2. 规范日志调用写法

打日志时不要提前将对象序列化为字符串,直接传入原始对象即可触发objectMessageAsJsonObject的序列化逻辑,正确写法示例:

// 直接传对象作为日志参数
User user = new User("Josué");
log.debug("{}", user);
// 显式使用ObjectMessage包装
log.debug(new ObjectMessage(user));

3. 排查日志依赖冲突

执行mvn dependency:tree命令检查项目依赖,确保已完全排除spring-boot-starter-logging引入的logback、slf4j-log4j12等冲突日志实现,同时将Log4j2版本升级到2.17.2及以上,避免旧版本异步线程下对象消息处理的已知bug。

内容的提问来源于stack exchange,提问作者Josué Fernández López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:15:04