Hibernate日誌輸出到SLF4J
阿新 • • 發佈:2018-11-24
一,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 地球都是你的了!