Hibernate日志输出到SLF4J
一,Hibernate日志问题
工程使用SLF4J,但日志文件一直没有看到Hibernate相关日志及showsql
二,Logback文件配置
修改Hibernate 日志输出指定为SLF4J,当修改了LOGBACK.xml 的日志输出文件后仍然也没看到hibernate相应日志
logback.xml 关键信息:
1 2 3 4 5 6 | <!-- 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:
1 2 3 | < 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
查看关键代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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方法启动的可设定变量
1 | System.setProperty( "org.jboss.logging.provider" , "slf4j" ); |
2,WEB 注解方式
1 2 3 4 5 6 | @WebListener public class ContextListenerExample implements ServletContextListener { public void contextInitialized(ServletContextEvent e){ System.setProperty( "org.jboss.logging.provider" , "slf4j" ); } } |
3,WEB.XML中配置WebApplicationInitializer
1 2 3 4 | @Override public void onStartup(ServletContext servletContext) throws ServletException { System.setProperty( "org.jboss.logging.provider" , "slf4j" ); } |
4,spring 配置方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | < 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 地球都是你的了!
分类:
hibernate
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2010-11-24 android 牛人必修 ant 编译android工程