您的位置:首页 > 其它

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

2012-08-14 12:56 399 查看
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 stacktrace
Caused 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 implementation
SLF4J: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐