如何使用logback创建2个不同的ROOT记录器?

时间:2013-09-16 12:07:08

标签: logging root logback slf4j

我很高兴使用SLF4J进行回溯,并使用 2 appenders 作为 ROOT 记录器。

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

我们怎样才能为两个appender设置不同的日志级别?我仍然需要所有ROOT-logger消息。

  • DEBUG -level for STDOUT
  • INFO -level for FILE

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

2 个答案:

答案 0 :(得分:50)

您将不会拥有多个root-logger,因此您的问题有点误导。您正在寻找的是如何微调每个appender记录的事件。

为此,您需要为每个appender添加一个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- 元素。但这不会创建多个root- logger ,这就是问题标题所要求的内容。此外,归档手册在http://logback.qos.ch/manual/configuration.html#syntax下突出显示(突出显示我的):

  

然而,配置文件的基本结构可以   被描述为,&lt;配置&gt;元素,后跟零或更多   &LT; appender&gt;元素,后跟零或更多&lt;记录器&gt;元素,   然后是最多一个&lt; root&gt;元件。

它可能有用,但至少它违反惯例。

答案 1 :(得分:4)

上一个答案错误:您可以拥有多个root元素,每个元素都有关联的日志记录levelappender-ref(我正在使用logback.version&GT; 1.0.13) 在这种情况下,您还必须在您的appender中放置一个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>