【发布时间】:2018-03-08 18:48:02
【问题描述】:
我对日志消息的级别有一些疑问。我知道有不同类型的日志记录级别以及何时使用什么。但我不明白的是,谁决定在 Logback 的目的地打印哪些级别的日志消息?
是 Logger 本身还是 appenders ?
通过记录器本身,我的意思是如果我将记录器日志记录级别设置为警告,那么记录器不会将级别低于警告(信息、跟踪、调试)消息传递给附加程序,或者附加程序有责任删除级别低于的消息然后警告目的地?
【问题讨论】:
我对日志消息的级别有一些疑问。我知道有不同类型的日志记录级别以及何时使用什么。但我不明白的是,谁决定在 Logback 的目的地打印哪些级别的日志消息?
是 Logger 本身还是 appenders ?
通过记录器本身,我的意思是如果我将记录器日志记录级别设置为警告,那么记录器不会将级别低于警告(信息、跟踪、调试)消息传递给附加程序,或者附加程序有责任删除级别低于的消息然后警告目的地?
【问题讨论】:
您在 Logger 而不是 Appender 上设置了级别。以下是 Logback 的 XML 配置中的一些示例:
<logger name="com.foo.bar" level="INFO"/>
<logger name="com.foo.bas" level="WARN"/>
在这些例子中:
com.foo.bar 的 Logger 都将受制于 INFO 级别com.foo.bas 的 Logger 都将受制于 WARN 级别Logback 的rootLogger 定义了默认级别,以下配置告诉Logback 将INFO 级别应用于所有记录器,除了那些使用<logger/> 声明显式配置的记录器:
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
更多详情in the docs.
回答这个具体问题:
通过记录器本身,我的意思是如果我将记录器日志记录级别设置为警告,那么记录器不会将级别低于警告(信息、跟踪、调试)消息传递给附加程序,或者附加程序有责任删除级别低于的消息然后警告目的地?
如果您的 Logger 是为 namepsace 中的类创建的:com.x.y 并且您定义了 <logger name="com.x.y" level="INFO"/>,那么 Logger 将过滤掉自 DEBUG 级别以来的任何 logger.debug() 调用低于INFO 级别。
【讨论】:
Logger 将丢弃日志事件,而不是将其传递给Appender。如果您查看 Logback 的 Logger 类,您会在其每个 filterAndLogXXX 方法中看到这个 if 语句:if (effectiveLevelInt > level.levelInt) { return; }。