【问题标题】:Configure default warn/error log with logback-classic/slf4j使用 logback-classic/slf4j 配置默认警告/错误日志
【发布时间】:2012-06-25 01:54:27
【问题描述】:

我正在尝试配置 logback-classic 来处理以下情况: 源自 my.class 且具有调试级别或更高级别的所有消息都应发送到标准输出附加程序。

并且所有警告级别或更高级别的错误消息应该转到 altout 附加程序,无论它们来自何处。但我似乎无法让它工作。

我已经尝试过这个配置,但问题是如果我将 additivity 设置为 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>

【问题讨论】:

  • 你能把初始化记录器的代码贴出来吗?

标签: java slf4j logback


【解决方案1】:

您的配置似乎是正确的,除了您颠倒了 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 和 Flop 日志错误及以上 STDOUT/ALTOUT。设置 additivity="false" 将导致 Flop 仅登录 STDOUT(但这不是您想要的,我从您的问题中了解到)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 2017-05-06
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多