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

