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

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格式

  1. 优化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>
  1. 在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依赖:

  1. 修改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>
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:27:49