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

部署到OpenShift后Log4j日志无法在控制台输出的求助

问题描述

本地环境搭配Log4j 2.22.1与WildFly 31.0.1.Final时,日志可正常打印;但将EAR包部署到OpenShift后,日志完全无法输出。查看部署阶段日志,发现如下错误:

ERROR [stderr] (MSC service thread 1-3) ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

当前使用的依赖配置:

implementation 'org.apache.logging.log4j:log4j-core:2.22.1'
implementation 'org.apache.logging.log4j:log4j-api:2.22.1'

已尝试以下方法但未解决问题:

  • 添加依赖:implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.21.1'
  • 配置log4j2.xml(包含Console与File Appender)
  • 在jboss-deployment-structure.xml中排除logging子系统
解决方案

1. 确保Log4j依赖被正确打包进EAR

Gradle的implementation依赖默认仅用于编译环节,若EAR构建脚本未配置将依赖打包到lib目录,部署到OpenShift后容器内会缺失log4j-core。需调整构建配置:

  • 若使用Gradle EAR插件,在ear配置中明确包含runtime依赖:
ear {
    dependencies {
        runtimeOnly 'org.apache.logging.log4j:log4j-core:2.22.1'
        runtimeOnly 'org.apache.logging.log4j:log4j-api:2.22.1'
    }
}
  • 构建完成后解压EAR包,检查lib目录下是否存在log4j-core-2.22.1.jar和log4j-api-2.22.1.jar。

2. 统一Log4j组件版本

添加的log4j-to-slf4j版本为2.21.1,与log4j-core的2.22.1版本不匹配,会引发类加载冲突。需改为同版本:

implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.22.1'

3. 完善WildFly日志模块排除配置

仅排除logging子系统不足以隔离容器自带日志组件,需在jboss-deployment-structure.xml中彻底排除相关模块,确保应用优先加载自身的Log4j:

<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="logging"/>
        </exclude-subsystems>
        <exclusions>
            <module name="org.apache.commons.logging"/>
            <module name="org.apache.log4j"/>
            <module name="org.jboss.logging"/>
            <module name="org.jboss.logging.jul-to-slf4j-stub"/>
            <module name="org.jboss.logmanager"/>
            <module name="org.jboss.logmanager.log4j"/>
            <module name="org.slf4j"/>
            <module name="org.slf4j.impl"/>
        </exclusions>
        <!-- 确保应用类加载优先级高于容器模块 -->
        <local-last value="false"/>
    </deployment>
</jboss-deployment-structure>

4. 修复OpenShift日志文件权限问题

log4j2.xml中配置的File Appender指向logs/app.log,但OpenShift容器内应用默认无该目录的写入权限,需调整路径或简化配置:

方案A:使用临时目录

修改File Appender的文件路径为JVM临时目录:

<File name="File" fileName="${java.io.tmpdir}/app.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p [%c{1}] %m%n"/>
</File>

方案B:仅保留控制台输出(适配OpenShift日志收集)

OpenShift默认收集容器控制台日志,可移除File Appender,仅保留Console:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p [%c{1}] %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="org.jboss" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

5. 验证容器内类路径

部署后可进入OpenShift容器,确认log4j-core存在于应用类路径:

# 进入目标Pod
oc rsh <你的Pod名称>
# 查看应用lib目录下的Log4j包
ls /deployments/lib | grep log4j

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:17:33