Hibernate日志輸出到SLF4J


 一,Hibernate日志問題

工程使用SLF4J,但日志文件一直沒有看到Hibernate相關日志及showsql

二,Logback文件配置

修改Hibernate 日志輸出指定為SLF4J,當修改了LOGBACK.xml 的日志輸出文件后仍然也沒看到hibernate相應日志

logback.xml 關鍵信息:

<!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

  

Spring 配置show sql:

<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>

  

啟動沒有看到Hibernate日志!(萬馬奔騰,種類=草泥馬)

三,原因排查

Hibernate 默認使用日志jar為 org.jboss.logging

查看關鍵代碼如下:

org.jboss.logging.LoggerProviders


static final String LOGGING_PROVIDER_KEY = "org.jboss.logging.provider";

final ClassLoader cl = LoggerProviders.class.getClassLoader();
try {
// Check the system property
final String loggerProvider = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return System.getProperty(LOGGING_PROVIDER_KEY);
}
});
if (loggerProvider != null) {
if ("jboss".equalsIgnoreCase(loggerProvider)) {
return tryJBossLogManager(cl, "system property");
} else if ("jdk".equalsIgnoreCase(loggerProvider)) {
return tryJDK("system property");
} else if ("log4j2".equalsIgnoreCase(loggerProvider)) {
return tryLog4j2(cl, "system property");
} else if ("log4j".equalsIgnoreCase(loggerProvider)) {
return tryLog4j(cl, "system property");
} else if ("slf4j".equalsIgnoreCase(loggerProvider)) {
return trySlf4j("system property");
}
}
} catch (Throwable t) {
// nope...
}

  

 

四,解決方案

通過設置環境變量為log 指定類型,方式如下:
1,MAIN方法啟動的可設定變量

System.setProperty("org.jboss.logging.provider", "slf4j");

  


2,WEB 注解方式

@WebListener
public class ContextListenerExample implements ServletContextListener {
public void contextInitialized(ServletContextEvent e){
System.setProperty("org.jboss.logging.provider", "slf4j");
}
}

  

3,WEB.XML中配置WebApplicationInitializer

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.setProperty("org.jboss.logging.provider", "slf4j");
}

  


4,spring 配置方式

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<!-- System.getProperties() -->
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="java.lang.System"/>
<property name="targetMethod" value="getProperties"/>
</bean>
</property>
<property name="targetMethod" value="putAll"/>
<property name="arguments">
<!-- The new Properties -->
<util:properties>
<prop key="org.jboss.logging.provider">slf4j</prop>
</util:properties>
</property>
</bean>

  

Spring 進行改方法System.getProperties() 方法的調用,NB,Spring 地球都是你的了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM