配置org.hibernate.SQL记录器时,Logback显示根目录为INFO的DEBUG输出

时间:2018-09-18 14:09:45

标签: java spring hibernate logging logback

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

上下文是使用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

由于使用批注,我不确定我找到了创建上面显示的Delete输出的确切类。从谷歌搜索中可以看到,有人建议对测井垫片类进行交互。但我不确定。

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

预先感谢您的提示。

3 个答案:

答案 0 :(得分:1)

删除此行:

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

答案 1 :(得分:0)

来自the docs

  

给定记录器L的有效级别等于其层次结构中的第一个非空级别,从L本身开始,然后在层次结构中向上发展到根记录器。

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

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

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

答案 2 :(得分:0)

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