在K8s环境Wildfly容器部署.ear时遇Log4j未知级别常量错误
在运行中的K8s环境直接部署.ear包时出现Log4j2级别常量错误,但将应用打包为Docker镜像后部署到K8s则无异常。
错误栈信息
java.lang.IllegalArgumentException: Unknown level constant [8]. at deployment.platform_sec.ear//org.apache.logging.log4j.Level.valueOf(Level.java:320) at deployment.platform_sec.ear//org.apache.logging.log4j.core.config.AbstractConfiguration.setToDefault(AbstractConfiguration.java:725) at deployment.platform_sec.ear//org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:47) at deployment.platform_sec.ear//org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:95) at deployment.platform_sec.ear//org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254) at deployment.platform_sec.ear//org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218) at deployment.platform_sec.ear//org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:136) at deployment.platform_sec.ear//org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123) at deployment.platform_sec.ear//org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:117) at deployment.platform_sec.ear//org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:150) at deployment.platform_sec.ear//org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at deployment.platform_sec.ear//org.apache.logging.log4j.LogManager.getContext(LogManager.java:196) at deployment.platform_sec.ear//org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599)
环境与配置信息
- 日志配置:使用
Log4j2.xml作为应用日志配置文件 - 容器应用服务器:Wildfly 20.0.0.Final
- Log4j版本:2.16.0
- 部署差异:直接在K8s运行的Wildfly实例中部署
.ear报错;将Wildfly与应用打包为Docker镜像后部署K8s无问题
已尝试操作
- 在
jboss-deployment-structure.xml中排除Wildfly的logging子系统,问题未解决
错误核心是Log4j2读取到非法的日志级别数值8(标准级别应为TRACE/DEBUG/INFO/WARN/ERROR/FATAL,对应数值为0/100/200/300/400/500),结合部署方式差异,问题根源在于运行中的K8s环境Wildfly存在日志配置污染,或类加载顺序异常。
具体排查修复步骤
检查Wildfly系统属性
直接部署时,K8s环境的Wildfly可能被设置了带非法数值的日志级别系统属性。执行命令查看系统属性:kubectl exec -it <wildfly-pod-name> -- /opt/jboss/wildfly/bin/jboss-cli.sh --connect command="/system-property"若发现
log4j.defaultLevel或类似属性值为8,删除该属性或修正为标准级别名称(如INFO)。强化类加载隔离与配置优先级
修改jboss-deployment-structure.xml,不仅排除logging子系统,还要强制应用优先加载自身类与配置:<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="logging"/> </exclude-subsystems> <dependencies> <module name="org.apache.log4j" export="true" services="import"/> </dependencies> <local-last value="false"/> <!-- 确保应用本地类优先加载 --> </deployment> </jboss-deployment-structure>验证实际部署的Log4j2配置
直接部署时,Log4j2.xml可能被K8s ConfigMap或挂载覆盖。进入Pod查看配置文件内容,确保所有日志级别均为标准名称,无<Root level="8">这类数值写法。清理Wildfly缓存
运行中的Wildfly可能残留旧缓存导致类加载异常,执行命令清理后重启Pod:kubectl exec -it <wildfly-pod-name> -- rm -rf /opt/jboss/wildfly/standalone/data/content kubectl exec -it <wildfly-pod-name> -- rm -rf /opt/jboss/wildfly/standalone/tmp确认应用包依赖完整性
检查.ear包是否包含完整的Log4j2核心依赖(log4j-core-2.16.0.jar、log4j-api-2.16.0.jar等),避免依赖Wildfly提供的非预期版本类:jar tf platform_sec.ear | grep log4j
内容的提问来源于stack exchange,提问作者user25137821

