为什么通过设置为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{"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>
在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"
预先感谢您的提示。
答案 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)实现的祖先记录器的行为将跳过日志级别检查。 然后,无论日志级别如何,都会将日志消息发送到根记录器。