Weblogic 12c 运行使用Slf4j日志框架应用解决方案

来源:互联网 发布:淘宝付款人数多久更新 编辑:程序博客网 时间:2024/05/17 04:03

Weblogic 12c版本使用slf4j作为logging facade,bind的logger为jdk14。这样在引擎(Weblogic)中加载的应用如果使用了slf4j+其他binder,运行时就会出现问题。


有人提出如下解决方案为:
删除weblogic lib中的slf4j相关jar文件(org.slf4j.api_1.6.1.0.jar\org.slf4j.ext_1.6.1.0.jar\org.slf4j.jdk14_1.6.1.0.jar.bak),但是这样在weblogic启动时会抛出

ClassNotFoundException。<2012-8-14 上午11时30分20秒 CST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to STANDBY.> <2012-8-14 上午11时30分20秒 CST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to STARTING.> <2012-8-14 上午11时30分21秒 CST> <Error> <Deployer> <BEA-149205> <Failed to initialize the application "name" due to error weblogic.management.DeploymentException: weblogic.management.DeploymentException:         at weblogic.application.internal.BaseDeployment.throwAppException(BaseDeployment.java:123)        at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:239)        at weblogic.application.internal.SingleModuleDeployment.prepare(SingleModuleDeployment.java:48)        at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:158)        at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:60)        Truncated. see log file for complete stacktraceCaused By: java.lang.ClassNotFoundException: org.slf4j.cal10n.LocLoggerFactory        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)        at java.security.AccessController.doPrivileged(Native Method)        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)        Truncated. see log file for complete stacktrace> 


这是意料之中的。weblogic启动时也要进行日志的初始化、slf4j的绑定等操作。从上述错误日志可以看出,weblogic通过org.slf4j.cal10n.LocLoggerFactory来进行初始化工作,该类位于org.slf4j.ext_1.6.1.0.jar包中。


若不删除weblogic中slf4j相关jar文件,应用启动会报如下异常(或org.slf4j.impl.JDK14LoggerFactory不能cast的异常)。目前对该异常的产生原因不是很理解:如下日志应当是应用启动后产生的,在slf4j初始化的时候(在测试应用的一个serlvet中),无论是org.slf4j.impl.JDK14LoggerFactory.class还是org.slf4j.helpers.NOPLoggerFactory都是ch.qos.logback.classic.LoggerContext的继承类,不应当抛出该类异常。除非在weblogic中的某个jar文件中有相同全限定名的类。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.<2012-8-14 上午10时51分46秒 CST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to STANDBY.> <2012-8-14 上午10时51分46秒 CST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to STARTING.> ................logback start................./webapps/name/WEB-INF/conf/logback.xml**** end ****java.lang.ClassCastException: org.slf4j.helpers.NOPLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext


后参考stackflow中的一个问题答案,问题得到解决:
在应用WEB-INF目录下创建一个名为weblogic.xml的配置文件,内容为:
<?xml version="1.0" encoding="UTF-8"?><wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">    <wls:container-descriptor>        <wls:prefer-application-packages>            <wls:package-name>org.slf4j</wls:package-name>        </wls:prefer-application-packages>    </wls:container-descriptor></wls:weblogic-web-app>

但是官方的推荐写法为:

<?xml version="1.0" encoding="UTF-8"?><weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">  <container-descriptor>    <prefer-web-inf-classes>false</prefer-web-inf-classes>    <prefer-application-packages>      <package-name>javax.faces.*</package-name>      <package-name>com.sun.faces.*</package-name>      <package-name>com.bea.faces.*</package-name>    </prefer-application-packages>     <prefer-application-resources>      <resource-name>javax.faces.*</resource-name>      <resource-name>com.sun.faces.*</resource-name>      <resource-name>com.bea.faces.*</resource-name>      <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>      </prefer-application-resources>  </container-descriptor></weblogic-web-app>

必须要加上<prefer-web-inf-classes>false</prefer-web-inf-classes>属性,且为false。

对该属性的解释为:

/** 
* If true, classes located in the WEB-INF directory of a web-app will be* loaded in preference to classes loaded in the application or system* classloader. * @default false */ 


不需要对weblogic-server做任何调整。此配置的作用为在应用启动时,使用应用的classpath的loader进行类加载。


参考文章:

http://stackoverflow.com/questions/9734503/prevent-weblogic-12c-from-using-systems-slf4j-binding

http://docs.oracle.com/cd/E15051_01/wls/docs103/programming/classloading.html

http://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm


原创粉丝点击