Java 配置org.hibernate.SQL记录器时,Logback在级别信息上显示根目录的调试输出
为什么logback允许通过设置为级别信息的根记录器进行调试输出 上下文是一个使用Hibernate的spring启动程序项目。POM将logback classic和logback core命名为1.2.0版。以下配置文件位于其类路径(src/main/resources)上,将根记录器设置为信息级别 logbacktest.xml: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
<configuration scan="true" debug="false">
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/test.log</file>
<encoder>
<pattern>%d{"yyyy-MM-dd'T'HH:mm:ss.SSSXXX", 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
然后,不管日志级别如何,日志消息都会发送到根日志记录器。是的,谢谢,我发现删除该行确实会抑制调试输出,但我想了解原因。他们使用的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" />