Wildfly26部署Spring Boot+Log4j2应用遇类型转换异常及日志问题
问题原因分析
1. 日志上下文类加载冲突
Wildfly 26.1.1升级了JBoss Log Manager与Log4j2的集成实现,容器提供的org.jboss.logmanager.log4j.JBossLoggerContext和Spring Boot 2.7.0自带的Log4j2核心包中的org.apache.logging.log4j.core.LoggerContext处于不同类加载器空间,导致类型转换失败。而Wildfly 15的日志子系统版本和当时的Log4j2兼容性更好,不会触发这个问题。
2. 重复日志格式问题
排除JBoss日志子系统后,Spring Boot的Log4j2会自行处理日志输出,但Wildfly默认的控制台处理器还会对应用输出的日志再做一次格式化,同一日志被两次加工,所以出现重复时间戳、日志级别这类格式问题。
解决方法
方法一:精准配置jboss-deployment-structure.xml+ 规范Log4j2格式
- 优化
jboss-deployment-structure.xml,彻底隔离容器日志模块,避免类加载冲突:
<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="logging"/> </exclude-subsystems> <exclusions> <module name="org.apache.log4j"/> <module name="org.apache.logging.log4j"/> <module name="org.jboss.logmanager.log4j"/> </exclusions> <local-last value="true"/> </deployment> </jboss-deployment-structure>
- 在Spring Boot的
log4j2-spring.xml里统一日志格式,同时关闭容器默认的控制台格式化:
<Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders>
然后在application.properties中添加:
logging.config=classpath:log4j2-spring.xml logging.pattern.console=
方法二:适配Wildfly日志子系统,不排除日志模块
如果想保留容器的日志管理能力,可以调整Wildfly配置和Spring Boot依赖:
- 修改Wildfly的
standalone.xml,统一日志格式,确保和Spring Boot输出兼容:
<subsystem xmlns="urn:jboss:domain:logging:8.0"> <loggers> <logger category="org.springframework"> <level name="INFO"/> </logger> </loggers> <handlers> <console-handler name="CONSOLE"> <level name="INFO"/> <formatter> <named-formatter name="APP_PATTERN"/> </formatter> </console-handler> </handlers> <formatters> <pattern-formatter name="APP_PATTERN" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </formatters> </subsystem>
- 调整Spring Boot依赖,排除默认日志模块,只保留Log4j2,并让日志交由容器处理:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
在application.properties中设置:
logging.system.out.level=OFF
方法三:升级Spring Boot版本
Spring Boot 2.7.x对Wildfly 26的适配性一般,升级到Spring Boot 3.x(注意需要JDK 17+),官方对Jakarta EE 9+的支持更完善,能更好兼容Wildfly 26的日志子系统,从根源解决类加载冲突问题。
内容的提问来源于stack exchange,提问作者Ajay Rajvanshi
相关产品推荐
相关产品推荐

