无法避免使用Spring Boot和Logback时将SQL日志记录到控制台

35

尽管我已经按以下方式使用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 配置是否已启用?如果是,请禁用它。 - Ali Dehghani
5个回答

32

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

spring.jpa.show-sql=false 

spring.jpa.properties.hibernate.show_sql=false

如果您设置

debug=true

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

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

Brgds


基本上,我将logging.level.org.hibernate.SQL设置为INFO,之前是DEBUG,这解决了问题。 - undefined

30
如果您将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

1
没想到这个问题可以这么简单。谢谢。 - garci560
LOG.isDebugEnabled() 的意思是它也受到日志配置的控制,例如 logback。 - xiaoyifang
这个解决方案解决了我的问题... 更具体地说是代码:spring.jpa.show-sql=false - Digao
3
在Spring Boot中,如所询问的那样,spring.jpa.properties.hibernate.show_sql=false是需要设置为false的一个属性,正如Mahaveer Jangir所回答的。 - JRA_TLL

15

基本上,您需要将两个属性设置为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>

1
这真的很有效。我受够了 Hibernate: ... 日志。谢谢。 - WesternGun

8
如果有人已经尝试了以上方法仍然存在问题,可以尝试设置以下属性:

logging.level.org.hibernate.SQL=OFF

仅有的一个在Springboot 2.4.3中起作用。 - Felix Aballi

0

我的应用程序是一个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>

分享这里以便对他人有所帮助。

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接