Java 配置org.hibernate.SQL记录器时,Logback在级别信息上显示根目录的调试输出

Java 配置org.hibernate.SQL记录器时,Logback在级别信息上显示根目录的调试输出,java,spring,hibernate,logging,logback,Java,Spring,Hibernate,Logging,Logback,为什么logback允许通过设置为级别信息的根记录器进行调试输出 上下文是一个使用Hibernate的spring启动程序项目。POM将logback classic和logback core命名为1.2.0版。以下配置文件位于其类路径(src/main/resources)上,将根记录器设置为信息级别 logbacktest.xml: <configuration scan="true" debug="false"> <appender name="FILE" class

为什么logback允许通过设置为级别信息的根记录器进行调试输出

上下文是一个使用Hibernate的spring启动程序项目。POM将logback classic和logback core命名为1.2.0版。以下配置文件位于其类路径(src/main/resources)上,将根记录器设置为信息级别

logbacktest.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>
在封面下,Hibernate似乎通过注释使用org.jboss.logging.Logger,请参阅

由于使用了注释,我不能确定是否找到了创建上述删除输出的确切类。我从谷歌上看到,有些人建议使用日志类的交互;但我不确定

非常相似的问题(所以我并不孤单:),但没有答案:

提前感谢您的提示。

删除此行:

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

来自:

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

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

如果要从
org.hibernate.SQL
logger禁用调试日志记录,请执行以下任一操作:

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

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

是的,谢谢,我发现删除该行确实会抑制调试输出,但我想了解原因。他们使用的JBoss日志记录器与许多其他日志框架兼容,如果不是主要日志框架,则向他们发送日志消息,例如,当它是像Hibernate这样的库的一部分时。在我工作的一个项目中,我添加了
System.setProperty(“org.jboss.logging.provider”,“slf4j”)在启动时,它使JBoss记录器将消息发送到正在使用的任何SLF4J实现。很可能是Spring告诉它使用logback,或者它自动检测到了它。至于为什么它使用该设置,而不是
root
root
定义了它默认的最低优先级值,并且这些消息被发送到
org.hibernate.SQL
,哪个具有更高的优先级设置。记录器org.hibernate.SQL的有效级别是实际调试(直接设置)还是信息(在根目录上设置)?在您的配置中,
org.hibernate.SQL
的有效级别为
DEBUG
,因为该级别设置在层次结构中低于
root
级别的
INFO
。中有四个有用的示例(以表格形式)说明了如何确定有效级别。我想我把继承/有效级别与筛选/截止级别混淆了。我现在明白了根配置设置了所有记录器的默认有效级别。因此,有了有效的调试级别,org.hibernate.SQL记录器可以让调试和更高级别的调试通过。我的文件appender没有filter子句,因此这些事件将显示在输出中。这是考虑这种情况的正确方法吗?您的文件追加器没有filter子句,因此它将接受日志子系统提供的任何内容。日志子系统将为它提供级别>=INFO的日志事件和
org.hibernate.sql
发出的级别>=DEBUG的所有日志事件。我没有询问可加性。我完全不理解这个答案。在您的logback-test.xml配置文件中,将additivity设置为false以停止向根日志记录器的“传播”,如答案中所述,根日志记录器在传播日志的情况下不检查日志级别,始终将写入已到达的消息。此配置将停止写入根记录器:。。。
  <logger name="org.hibernate.SQL" level="DEBUG" />