升级到hibernate4之后,发现它的日志没办法控制了。
也不知道他到底用的是什么日志。
分析了许久,原来他用的是jboss-logging。他在这里面定义了一系列的日志处理。
由于我的系统所有日志都通过使用slf4j+log4j2来实现的。
就hibernate不能通过slf4j->log4j2中,实在的点烦人。
分析过程思路是这样的,只看结果的,请忽略。
1.通过定位到日志输出位置。
三月 27, 2015 11:58:52 上午 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
|
通过以上日志输出,找到
Configuration.java源代码,进而找到输出
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml的位置。
2.查找它的日志实现具体用的哪一个。
/* */
public
Configuration configure(String
resource
)
/* */ throws HibernateException
/* */ {
/* 2075 */ LOG .configuringFromResource( resource );
/* 2076 */ InputStream stream = getConfigurationInputStream( resource );
/* 2077 */ return doConfigure( stream , resource );
/* */ throws HibernateException
/* */ {
/* 2075 */ LOG .configuringFromResource( resource );
/* 2076 */ InputStream stream = getConfigurationInputStream( resource );
/* 2077 */ return doConfigure( stream , resource );
/* */
}
通过debug工具,跟踪LOG的实例到底是哪一个。找到其实现类:
org.jboss.logging.JDKLogger
3.定位到日志实现类的实例是如何产生的。
4.找到日志实现实例产生类的代码,复制到src目录下,然后修改这里的代码,故意抛出一个运行时异常
5.这样就可以跟踪到日志实现类是如何产生的。
最后在,
org.jboss.logging.LoggerProvider类中到了这样的代码:
/* 44 */ String loggerProvider = (String)AccessController.doPrivileged(new PrivilegedAction() {
/* */ public String run() {
/* 46 */ return System.getProperty("org.jboss.logging.provider");
/* */ }
/* */ });
/* 49 */ if (loggerProvider != null) {
/* 50 */ if ("jboss".equalsIgnoreCase(loggerProvider))
/* 51 */ return tryJBossLogManager(cl);
/* 52 */ if ("jdk".equalsIgnoreCase(loggerProvider))
/* 53 */ return tryJDK();
/* 54 */ if ("log4j".equalsIgnoreCase(loggerProvider))
/* 55 */ return tryLog4j(cl);
/* 56 */ if ("slf4j".equalsIgnoreCase(loggerProvider)) {
/* 57 */ return trySlf4j();
/* */ }
/* */ public String run() {
/* 46 */ return System.getProperty("org.jboss.logging.provider");
/* */ }
/* */ });
/* 49 */ if (loggerProvider != null) {
/* 50 */ if ("jboss".equalsIgnoreCase(loggerProvider))
/* 51 */ return tryJBossLogManager(cl);
/* 52 */ if ("jdk".equalsIgnoreCase(loggerProvider))
/* 53 */ return tryJDK();
/* 54 */ if ("log4j".equalsIgnoreCase(loggerProvider))
/* 55 */ return tryLog4j(cl);
/* 56 */ if ("slf4j".equalsIgnoreCase(loggerProvider)) {
/* 57 */ return trySlf4j();
/* */ }
/* */
}
看到这里就明白了。
如果我要接slf4j,那么有两咱方法可行
第一:增加JVM参数-D
org.jboss.logging.provider=slf4j
第一:在程序的最前面加上:
System.setProperty(
"org.jboss.logging.provider"
,
"slf4j"
);
最后,最近ITEYE上,老是出现这样的文章:
JavaEE框架Bootstrap、HTML5、SpringMVC、Hibernate(XXXX)
此人由于恶意发广告,被峰了好多号。
此人不过是整合了一下几大SSH,mybatis等之类的后端框架+bootstrap ace框架。
然后就拿到网上来卖钱,而且绝口不提bootstrap ace原作者的版权。
实在恶心可恶。
希望看到此文的朋友不要上当。
此人品行之低劣,前无古人后无来者。
具体情况,请看这篇文章: