使用logback-classic / slf4j配置默认警告/错误日志

时间:2012-06-22 18:02:32

标签: java slf4j logback

我正在尝试配置logback-classic来处理以下情况: 所有来自my.class并且级别调试或更高级别的消息都应该发送到stdout appender。

所有级别警告或更高级别的错误消息都应该转到altout appender,无论它们来自何处。但我似乎无法让它发挥作用。

我试过这个配置,但问题是如果我将additive设置为true,那么记录到stdout的所有消息也会被发送到altout,无论它们的警告级别如何。但是如果我设置additivity = false,那么即使他们有警告/错误级别,也不会将来自my.server的消息发送到altout。

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>Stdout: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="ALTOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>Altout: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name='my.class'  level='debug' additivity="false">
    <appender-ref ref="ALTOUT" />
  </logger>

  <root level="warn">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

2 个答案:

答案 0 :(得分:2)

使用ALTOUT上的http://logback.qos.ch/manual/filters.html#thresholdFilter过滤低于警告的所有事件。

答案 1 :(得分:2)

您的配置似乎是正确的,除了您反转STDOUT和ALTOUT(根据您的初始描述)。设置additivity="true"将使用指定的级别将消息记录到STDOUT和ALTOUT。

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>Stdout: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="ALTOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>Altout: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="Flop"  level="error" additivity="true">
    <appender-ref ref="STDOUT" />
  </logger>

  <root level="warn">
    <appender-ref ref="ALTOUT" />
  </root>
</configuration>

使用以下Java类:

public class Flop {

    private Logger log = LoggerFactory.getLogger(Flop.class);


    public void plop() {
        log.debug("Flop debug");
        log.warn("Flop warn");
        log.error("Flop error");
    }
}

public class Main {

    private Logger log = LoggerFactory.getLogger(Main.class);

    public void prout() {
        log.debug("Main debug");
        log.warn("Main warn");
        log.error("Main error");
    }
    public static void main(String[] args) {
        new Main().prout();
        new Flop().plop();
    }
}

结果将是:

Altout: 14:55:26.288 [main] WARN  com.excilys.Main - Main warn
Altout: 14:55:26.292 [main] ERROR com.excilys.Main - Main error
Stdout: 14:55:26.292 [main] ERROR com.excilys.Flop - Flop error
Altout: 14:55:26.292 [main] ERROR com.excilys.Flop - Flop error

即。 STDOUT和ALTOUT上的STDOUT和Flop日志错误及以上的主日志警告及以上。设置additivity="false"将导致Flop仅在STDOUT中记录(但这不是您想要的,正如我从您的问题中所理解的那样)。