1

次の状況を処理するようにlogback-classicを構成しようとしています。レベルdebug以上のmy.classから発信されたすべてのメッセージは、stdoutアペンダーに送信する必要があります。

また、警告レベル以上のすべてのエラーメッセージは、発生元に関係なく、altoutアペンダーに送信する必要があります。しかし、私はそれを機能させることができないようです。

この構成を試しましたが、問題は、加法性を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>
4

2 に答える 2

2

ALTOUTでhttp://logback.qos.ch/manual/filters.html#thresholdFilterを使用して、警告以下のすべてのイベントをフィルタリングします。

于 2012-06-27T08:53:44.777 に答える
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で警告以上を記録し、FlopログはSTDOUT/ALTOUTの両方でエラーをログ上に記録します。設定additivity="false"すると、FlopはSTDOUTにのみログインします(ただし、あなたの質問から理解できるように、それはあなたが望むものではありません)。

于 2012-06-27T12:57:45.363 に答える