【问题标题】:Can't avoid hibernate logging SQL to console with Spring Boot and Logback无法避免使用 Spring Boot 和 Logback 将休眠记录 SQL 到控制台
【发布时间】:2016-07-29 12:21:56
【问题描述】:

尽管使用 Logback 配置了 Hibernate 的特定日志记录,但我的 Spring Boot 应用程序仍然在控制台中显示 Hibernate 查询,如下所示:

<appender name="HIBERNATE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGDIR}/hibernate.log</file>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGDIR}/hibernate.log.%d</fileNamePattern>
    </rollingPolicy>
</appender>

<logger name="org.hibernate" additivity="false">
    <appender-ref ref="HIBERNATE"/>
</logger>

<logger name="org.hibernate.SQL" additivity="false">
    <appender-ref ref="HIBERNATE"/>
</logger>

<logger name="org.hibernate.type.descriptor.sql" additivity="false">
    <appender-ref ref="HIBERNATE"/>
</logger>

它确实将 Hibernate 的日志(包括查询)发送到文件 hibernate.log。但我也想避免控制台中的查询,我认为这种配置应该会发生这种情况。

我错过了什么?

【问题讨论】:

  • hibernate.show_sql 配置是否启用?如果是这样,只需禁用它

标签: java spring hibernate spring-boot logback


【解决方案1】:

如果将hibernate.show_sql 设置为true,Hibernate 将简单地将SQL 语句打印到控制台(不要与org.hibernate.SQL 下的日志记录混淆)。 SqlStatementLogger 负责记录 SQL 语句,它的 logStatement 看起来像:

public void logStatement(String statement, Formatter formatter) {
    if ( format ) {
        if ( logToStdout || LOG.isDebugEnabled() ) {
            statement = formatter.format( statement );
        }
    }
    LOG.debug( statement );
    if ( logToStdout ) {
        System.out.println( "Hibernate: " + statement );
    }
}

因此,如果您不想在控制台上看到查询,只需将 hibernate.show_sql 设置为 false 或将其完全删除即可。在 Spring Boot 中,只需将其添加到您的 application.properties:

spring.jpa.show-sql=false

【讨论】:

  • 没想到会这么简单。谢谢
  • LOG.isDebugEnabled() 表示它也由记录器配置控制,例如 logback
  • 这个解决方案解决了我的问题......更具体地说,代码:spring.jpa.show-sql=false
  • 在 Spring Boot 中,如要求,spring.jpa.properties.hibernate.show_sql=false 是 Mahaveer Jangir 回答的需要设置为 false 的一个属性。
【解决方案2】:

我只是想分享一下,我刚刚注意到有另一个设置可能导致 org.hibernate.SQL 在 Spring Boot JUnit 测试中进行调试,尽管您可能已经设置了

spring.jpa.show-sql=false 

spring.jpa.properties.hibernate.show_sql=false

...

如果你设置了

debug=true

在您的 Spring 应用程序*.properties 文件中!

此设置为 true 将覆盖 show-sql 设置并将其设置为 true。

品牌

【讨论】:

    【解决方案3】:

    你基本上需要将2个属性设置为false。

    如果您使用的是 Spring boot ,则在 Application.properties 中进行如下设置

    spring.jpa.properties.hibernate.generate_statistics=false
    spring.jpa.properties.hibernate.show_sql=false
    

    如果你使用的是hibernate.cfg.xml,那么设置如下

    <property name="hibernate.generate_statistics">false</property>
    <property name="show_sql">false</property>
    

    【讨论】:

    • 这确实有效。我受够了Hibernate: ... 日志。谢谢。
    【解决方案4】:

    如果有人尝试了上述所有方法但仍有问题,请尝试设置属性:

    logging.level.org.hibernate.SQL=OFF
    

    【讨论】:

    • 唯一一个使用Springboot 2.4.3的方法
    【解决方案5】:

    我的应用程序是 spring-boot 的,

    出于某种原因,在我的情况下,属性“spring.jpa.show-sql=false”不起作用。 我可以看到带有绑定值的 sql 继续在控制台/日志中打印查询。

    通过将根级别更改为错误来解决,如下所示

    <root level="ERROR"> <appender-ref ref="STDOUT"/> </root>

    虽然我们在根目录中将日志级别更改为错误,但我们仍然可以使用下面的单独记录器以信息模式打印我们的包/应用程序日志

    <logger name="com.application.code" level="INFO"> <appender-ref ref="FILE"/> <appender-ref ref="ERR_FILE"/> </logger>

    把它放在这里可能会对某人有所帮助。

    谢谢

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 2012-10-24
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多