【问题标题】:Who decides which levels of log message to be printed in destination in logback?谁决定在 logback 的目的地打印哪些级别的日志消息?
【发布时间】:2018-03-08 18:48:02
【问题描述】:

我对日志消息的级别有一些疑问。我知道有不同类型的日志记录级别以及何时使用什么。但我不明白的是,谁决定在 Logback 的目的地打印哪些级别的日志消息?

是 Logger 本身还是 appenders ?

通过记录器本身,我的意思是如果我将记录器日志记录级别设置为警告,那么记录器不会将级别低于警告(信息、跟踪、调试)消息传递给附加程序,或者附加程序有责任删除级别低于的消息然后警告目的地?

【问题讨论】:

    标签: logging logback


    【解决方案1】:

    您在 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 级别应用于所有记录器,除了那些使用&lt;logger/&gt; 声明显式配置的记录器:

    <root level="INFO">          
      <appender-ref ref="STDOUT" />
    </root>  
    

    更多详情in the docs.

    回答这个具体问题:

    通过记录器本身,我的意思是如果我将记录器日志记录级别设置为警告,那么记录器不会将级别低于警告(信息、跟踪、调试)消息传递给附加程序,或者附加程序有责任删除级别低于的消息然后警告目的地?

    如果您的 Logger 是为 namepsace 中的类创建的:com.x.y 并且您定义了 &lt;logger name="com.x.y" level="INFO"/&gt;,那么 Logger 将过滤掉自 DEBUG 级别以来的任何 logger.debug() 调用低于INFO 级别。

    【讨论】:

    • 所以这意味着 logger 不会将级别为 DEBUG 的消息传递给 appender 。它会将它们过滤掉。我理解对吗?
    • @Prashank 是的,没错,Logger 将丢弃日志事件,而不是将其传递给Appender。如果您查看 Logback 的 Logger 类,您会在其每个 filterAndLogXXX 方法中看到这个 if 语句:if (effectiveLevelInt &gt; level.levelInt) { return; }
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2012-10-06
    • 2014-10-21
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多