配置 org.hibernate.SQL 记录器时,Logback 显示 DEBUG 输出,根目录位于 INFO 级别

chr*_*own 8 java logging spring hibernate logback

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

上下文是一个使用 Hibernate 的 spring-boot-starter 项目。在版本 1.2.0 中,POM 命名为 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>
Run Code Online (Sandbox Code Playgroud)

在 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=?
Run Code Online (Sandbox Code Playgroud)

在幕后,Hibernate 似乎通过注释使用 org.jboss.logging.Logger,请参阅https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate /内部/CoreLogging.java

由于使用了注释,我不确定是否找到了创建上面所示的删除输出的确切类。我通过谷歌搜索发现,有些人建议进行日志填充类的交互;但我不确定。

非常相似的SO问题(所以我并不孤单:)但没有答案:使用logback,尽管根级别设置为“错误”,但仍在记录调试消息

预先感谢您的任何提示。

gly*_*ing 5

来自文档:

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

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

如果您想禁用org.hibernate.SQL记录器的调试日志记录,则:

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