当配置org.hibernate.SQL记录器时,Logback显示带有根级别INFO的DEBUG输出

问题描述 投票:1回答:3

为什么logback允许DEBUG输出通过根记录器设置为INFO级别?

上下文是一个使用Hibernate的spring-boot-starter项目。 POM在版本1.2.0中命名logback-classic和logback-core。以下配置文件位于其类路径(src / main / resources)上,将根记录器设置为INFO级别。

的logback-的test.xml:

<configuration scan="true" debug="false">
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/test.log</file>
    <encoder>
      <pattern>%d{&quot;yyyy-MM-dd'T'HH:mm:ss.SSSXXX&quot;, UTC} [%thread] %-5level %logger{5} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="FILE" />
  </root>
  <logger name="org.hibernate.SQL" level="DEBUG" />
</configuration>

在JUnit测试期间,文件中有大量INFO / WARN / ERROR消息。但是我很惊讶地看到org.hibernate.SQL的以下DEBUG输出,它是唯一提供调试级输出的包。我想我必须将根记录器设置为DEBUG级别以允许这个;我认为级别INFO会阻止它:

2018-09-18T13:31:02.596Z [http-nio-auto-1-exec-4] DEBUG o.h.SQL - delete from C_NOTIF_XYZ where ID=?

看来Hibernate通过注释使用org.jboss.logging.Logger,参见https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/CoreLogging.java

由于使用了注释,我不相信我找到了创建上面显示的删除输出的确切类。我从谷歌搜索看到有些人建议记录垫片类的互动;但我不确定。

非常相似的问题(所以我并不孤单:)但没有答案:Using logback, debug messages are still being logged though root level is set to "Error"

提前感谢任何提示。

java spring hibernate logging logback
3个回答
0
投票

来自the docs

给定记录器L的有效级别等于其层次结构中的第一个非空级别,从L本身开始并在层次结构中向上朝向根记录器继续。

因此,您可以为记录器定义一个覆盖根级别的有效级别。您看到的行为是默认的Logback行为。

如果要从org.hibernate.SQL记录器中禁用DEBUG日志记录,则可以:

  • 删除org.hibernate.SQL记录器配置,因为这将导致org.hibernate.SQL记录器采用root记录器级别
  • org.hibernate.SQL记录器分配给DEBUG以外的日志级别

1
投票

删除此行:

  <logger name="org.hibernate.SQL" level="DEBUG" />

0
投票

目前我没有找到对文档的引用,但我确认了这种操作模式:通过additivity达到的祖先记录器的行为,默认设置为true,跳过日志级别检查。然后,无论日志级别如何,都会将日志消息发送到根记录器。

© www.soinside.com 2019 - 2024. All rights reserved.