【问题标题】:How to create 2 different ROOT loggers with logback?如何使用 logback 创建 2 个不同的 ROOT 记录器?
【发布时间】:2013-09-20 13:55:36
【问题描述】:

我很高兴将 SLF4J 与 logback 一起使用,并为 ROOT 记录器使用 2 个附加程序

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>

我们如何为两个 appender 设置不同的日志级别?我仍然需要所有 ROOT 记录器消息。

  • DEBUG-STDOUT 级别
  • INFO-文件级别

所有日志都需要成为输出的一部分(因此需要 ROOT 记录器)。

【问题讨论】:

    标签: logging root logback slf4j


    【解决方案1】:

    您永远不会拥有一个以上的根记录器,因此您的问题有点误导。您正在寻找的是如何微调每个附加程序记录的事件。

    为此,您向每个附加程序添加一个 ThresholdFilter:

    http://logback.qos.ch/manual/filters.html#thresholdFilter

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
    

    为 FILE-appender 配置级别 INFO,为 STDOUT 配置 DEBUG。

    编辑:我不得不反驳另一个答案的指控,即这个错误:是的,您可以在配置中拥有多个根-元素。但是,这不会创建多个 root-logger,而这正是问题标题所要求的。此外,http://logback.qos.ch/manual/configuration.html#syntax(突出显示我的)下的 logback 手册状态:

    尽管如此,配置文件的基本结构可以 被描述为,元素,后跟零个或多个 元素,后跟零个或多个 元素, 后跟最多一个 元素。

    它可能会起作用,但至少它是违反惯例的。

    【讨论】:

    • 我有&lt;logger name="ch.qos" level="OFF" /&gt; &lt;logger name="org.slf4j" level="OFF" /&gt;,但它仍在登录配置的两个附加程序,这怎么可能?
    • 我怀疑没有人能用这么少的信息来帮助你。如果您有问题要解决,请打开一个新问题,cmets 不是这个地方。
    • 它似乎确实有效,但不仅文档而且代码都显示仅支持一个根记录器,所以我怀疑根记录器的某些功能被遗漏了。例如。如果您声明 2 个根记录器并且一个具有不同的级别,那么默认级别是多少?请注意 source code 如何在构造函数中创建和初始化 single 根记录器。
    • @Rhubarb 默认级别将是最后一组。查看维护者的回答:stackoverflow.com/questions/41647036/…
    • logback 具有基于包的继承性......但根本不是按级别......
    【解决方案2】:

    您可以拥有多个 root 元素,每个元素都有一个关联的日志记录 level 和一个 appender-ref(我正在使用 logback.version>1.0.13) 在这种情况下,您还必须在您的附加程序中放置一个 FILTER,如下所示:

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>
    
    <!-- To enable JMX Management -->
    <jmxConfigurator/>
    
    <appender name="console-info" class="ch.qos.logback.core.ConsoleAppender">
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
         <level>INFO</level>
         <onMatch>ACCEPT</onMatch>
         <onMismatch>DENY</onMismatch>
      </filter>
      <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
      </encoder>
    </appender>  
    
    <appender name="console-debug" class="ch.qos.logback.core.ConsoleAppender">
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
         <level>DEBUG</level>
         <onMatch>ACCEPT</onMatch>
         <onMismatch>DENY</onMismatch>
      </filter>
      <encoder>
          <pattern>[%d{ddMMMyyyy HH:mm:ss.SS}]%-5level %logger{45} - %msg %n</pattern>
      </encoder>
    </appender>
    
    
    <root level="info">
        <appender-ref ref="console-info"/>
    </root>
    <root level="debug">
        <appender-ref ref="console-debug"/>
    </root>
    

    【讨论】:

    • 这与文档不符:logback.qos.ch/manual/configuration.html#syntax ..“最多一个 元素”
    • 您的配置具有误导性。您的console-debug 仅记录debug 级别(例如,不是warn),类似地console-info 仅记录info 级别。
    • 在双根定义的情况下,appender 会累积吗?我认为根据手动“信息”,“警告”和“错误”级别的消息将进入两个日志(假设未为附加程序设置过滤器)。我说的对吗?
    • 多个根标签不会给出任何错误。但是,它没有按预期工作。第二个附加程序也接收信息消息。只有前面的答案是对的。
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2015-08-10
    相关资源
    最近更新 更多