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 */
参考文章:
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
- Weblogic 12c 运行使用Slf4j日志框架应用解决方案
- SLF4J+Logback 日志框架使用
- SLF4J+Logback 日志框架使用
- SLF4J+Logback 日志框架使用
- SLF4J+Logback 日志框架配置和使用
- 通用日志框架--SLF4J
- SLF4J日志框架
- logback+slf4j日志框架
- SLF4J日志框架问答
- slf4j框架日志记录
- SLF4J日志框架
- 使用Slf4j集成Log4j2构建项目日志系统解决方案
- 使用SLF4J+Logback作为Java项目的日志框架
- slf4j日志的使用
- slf4j日志的使用
- 使用slf4j编写日志
- slf4j日志的使用
- SLF4J日志的使用
- POJ 3270 Cow Sorting(置换循环节)
- 学习步骤?(copy过来的)
- iOS开发之多媒体
- Android入门/ImageSwitcher(十四)
- 自旋锁使用的注意点
- Weblogic 12c 运行使用Slf4j日志框架应用解决方案
- 尝试用%s输出空指针
- Ubuntu 12.04 LTS编译安装emacs
- OPENSSL VS环境下源码调试
- 如何在多个移动平台上创建新的cocos2d-x项目
- 根据今天的日期或者传入的日期得到本日所在周的开始日期和结束日期
- hibernate的session.save/persisten方法的区别
- 名人女儿不好当 迈克尔·戴尔女儿删推特
- 使用mysql dump 导入与导出的方法