logbackで設定を記述する時の注意事項等。

slf4j可愛いよ、SLF4J。と言う訳で、logbackを使う訳だ。
でも、何かようワカランけど、ちゃんとログが出ない事があったりなかったり。
と言うか、出ない事は少ないんだけど、出過ぎる事がある。


使ってるのは、

で、logback.xmlを記述しちる訳だす。


より新しいバージョンで設定を記述する際のポイントを

に書いているます。
以下の内容には、相応に不適切な内容を含んでいるます。


で、こんなコードを書く訳。

public class Main {
  public static void main(String[] args) {
    Logger bb = LoggerFactory.getLogger("aa.bb");
    Logger cc = LoggerFactory.getLogger("aa.bb.cc");
    Logger dd = LoggerFactory.getLogger("aa.bb.cc.dd");

    Logger[] ary = { bb, cc, dd };
    for (Logger l : ary) {
      l.debug("x");
      l.info("y");
      l.error("z");
    }
  }
}

設定ファイルはこんな感じ。

<configuration>
  <appender name="STDOUT1" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>STDOUT1 %d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</Pattern>
    </layout>
  </appender>
  <appender name="STDOUT2" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>STDOUT2 %d{HH:mm:ss.SSS} %-5level %logger{20} - %msg%n</Pattern>
    </layout>
  </appender>
  <appender name="STDOUT3" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>STDOUT3 %d{HH:mm:ss.SSS} %-5level %logger{20} - %msg%n</Pattern>
    </layout>
  </appender>
  <appender name="STDOUT4" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>STDOUT4 %d{HH:mm:ss.SSS} %-5level %logger{20} - %msg%n</Pattern>
    </layout>
  </appender>
  <logger name="aa">
    <level value="INFO" />
    <appender-ref ref="STDOUT2" />
  </logger>
  <logger name="aa.bb">
    <level value="DEBUG" />
    <appender-ref ref="STDOUT3" />
  </logger>
  <logger name="aa.bb.cc" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="STDOUT4" />
  </logger>
  
  <root>
    <level value="ERROR"/>
    <appender-ref ref="STDOUT1" />
  </root>
</configuration>

で、こいつを実行すると、こんな感じにログが出る。

STDOUT3 22:01:08.031 DEBUG aa.bb - x
STDOUT2 22:01:08.031 DEBUG aa.bb - x
STDOUT1 22:01:08.031 DEBUG aa.bb - x
STDOUT3 22:01:08.031 INFO  aa.bb - y
STDOUT2 22:01:08.031 INFO  aa.bb - y
STDOUT1 22:01:08.031 INFO  aa.bb - y
STDOUT3 22:01:08.031 ERROR aa.bb - z
STDOUT2 22:01:08.031 ERROR aa.bb - z
STDOUT1 22:01:08.031 ERROR aa.bb - z
STDOUT4 22:01:08.031 DEBUG aa.bb.cc - x
STDOUT4 22:01:08.031 INFO  aa.bb.cc - y
STDOUT4 22:01:08.031 ERROR aa.bb.cc - z
STDOUT4 22:01:08.031 DEBUG aa.bb.cc.dd - x
STDOUT4 22:01:08.031 INFO  aa.bb.cc.dd - y
STDOUT4 22:01:08.031 ERROR aa.bb.cc.dd - z

ひゃっほう!
微妙に、僕の直観とは合わない感じで、ログが出ているけど、
細かく説明するのが面倒なので、ハマるポイントだけ。

  • loggerタグやrootタグに書ける属性は、additivityだけ。level属性とか書いても無視される。
  • loggerタグのadditivityは、より上位のカテゴリの設定を引き継ぐかどうかを決める属性。
  • logback.xmlをクラスパスのルートにおいておけば、自動的にロードしちくりる。


残りは、大体この辺みてちょ。

  • Chapter3: Logback configuration & Joran
    • 設定内容に対して、どんな風にログが出力されたり、されなかったりするか知りたい時はここを見る。
  • Chapter 5: Layouts
    • logbackにデフォルトで入ってるレイアウトエンジンの記述に関するまぬあるはココ。
      cとCの違いとか、mとMの違いとかマジ痺れる。
      正直、markerの使い方はよく分からん。