如何让WAR包在TomEE 9.1.0中配合Logback正常实现日志功能
TomEE 9.1.0升级后Logback日志异常问题及解决
问题描述
将TomEE从8.0.14升级至9.1.0后,WAR包的Logback日志功能未按预期工作:
- TomEE全局库目录
/opt/tomee/lib包含slf4j-api-1.7.36.jar和slf4j-jdk14-1.7.36.jar - WAR包内
/opt/tomee/webapps/myDeployment/WEB-INF/classes下的logback.xml已被正常读取,但日志未写入专属文件,而是输出到catalina.out - 调试发现当前日志器类型为
org.slf4j.impl.JDK14LoggerAdapter,而非预期的ch.qos.logback.classic.Logger - WAR包内
WEB-INF/lib的日志相关依赖:jcl-over-slf4j-1.7.36.jar jul-to-slf4j-2.0.7.jar liquibase-slf4j-5.0.0.jar logback-classic-1.4.11.jar logback-core-1.4.11.jar
补充问题
将logback-classic-1.2.11.jar和logback-core-1.2.11.jar添加到/opt/tomee/lib后,日志能写入专属文件,但出现SLF4J多绑定警告,且日志同时输出到catalina.out和专属文件,存在重复输出,需要实现WAR包日志与全局JDK14LoggerFactory分离。
解决方案
1. 移除全局SLF4J绑定,优先使用WAR包内置Logback
TomEE全局的slf4j-jdk14-1.7.36.jar是导致绑定优先级高于WAR包内置Logback的核心原因,直接删除该文件:
rm /opt/tomee/lib/slf4j-jdk14-1.7.36.jar
删除后,SLF4J会自动加载WAR包内logback-classic提供的绑定实现,无需将Logback依赖放到全局目录,彻底解决多绑定问题。
2. 修复SLF4J与Logback版本兼容性
Logback 1.4.x要求SLF4J版本为2.0.x及以上,当前WAR包内slf4j-api-1.7.36版本过低,存在兼容问题:
- 将WAR包内的
slf4j-api-1.7.36.jar替换为slf4j-api-2.0.7.jar(与jul-to-slf4j-2.0.7.jar版本保持一致) - 保留WAR包内的
logback-classic-1.4.11.jar和logback-core-1.4.11.jar,确保版本匹配
3. 消除重复日志输出
如果移除全局绑定后仍存在日志重复输出,可通过以下两种方式处理:
方式一:调整Logback配置阻止JUL日志流入
在logback.xml中添加配置,重置JUL(Java Util Logging)并关闭自动转发:
<configuration debug="true"> <!-- 原有appender和root配置保持不变 --> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <turboFilter class="ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter"> <resetJUL>true</resetJUL> </turboFilter> </configuration>
方式二:调整TomEE全局日志配置
修改/opt/tomee/conf/logging.properties,将全局JUL日志级别设为OFF:
.level = OFF
4. 验证配置效果
重启TomEE后,检查以下内容:
- 启动日志中无SLF4J多绑定警告
- 日志仅写入专属文件
logs/theDedicatedLogFile.log,不再输出到catalina.out - 调试日志器类型为
ch.qos.logback.classic.Logger
内容的提问来源于stack exchange,提问作者Clueless
相关产品推荐
相关产品推荐

