情景:
项目部署在tomcat有日志文件输出,而部署在weblogic 12c上就没有日志文件的输出。
分析:
可能的原因1:项目中的 slf4j 的和 weblogic 12c 自带的slf4j模块冲突。
解决办法:在 WEB-INF目录新增 weblogic.xml,配置优先加载项目中的slf4j 模块。
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<container-descriptor>
<prefer-application-packages>
<package-name>org.slf4j</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>
可能的原因2:项目中存在多个日志实现框架,如logback、log4j。这样会导致一个问题,slf4j门面绑定的实现框架不确定。
小编遇到的情况是这样的:项目预期是使用logback框架,所以配置了logback.xml文件。在tomcat运行正常,但在 weblogic环境中无法打印日志。经查,运行过程中slf4j绑定的日志实现并不是logback。而是其他框架。
如图,多个found binding,说明找到多个日志实现。而Actual binding即为实际绑定的日志实现。我们预期是使用 logback,但实际上绑定的是 log4j。
再往下深究,项目中并没有显式的引入图中所显示的 slf4j-log4j12 依赖。这包是从哪来的?使用maven依赖包分析工具,发现该包是由于引入 zookeeper依赖而间接引入的。
到这里,知道jar包的来源就好办了。
解决办法:
方式1. 添加 log4j.xml 配置文件。既然实际绑定的是log4j,自然添加了配置就能输出日志。(不推荐,随机绑定不可控)
方式2. 将 slf4j-log4j12 的依赖排除掉,仅保留logback。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
refrence:
官网 weblogic.xml配置文件说明
源码解读SLF4J绑定日志实现的原理
Weblogic 12c 运行使用Slf4j日志框架应用解决方案