logback.xmlの具体例。

「開発用以外に仕様として別途ログを出力する」場合や
「開発用でも分けて出力したい」場合など、
複数のappenderに出力するときのlogback.xmlの設定を考える。

ケース1.同じ内容を複数のappenderに出力する

ファイルとコンソールなど同じ内容を複数のappenderに出力するときは、
rootにappender-refを加えるだけでOK。

<root level="debug">
  <appender-ref ref="STDOUT" />
  <appender-ref ref="LOG_FILE" />
</root>

ケース2.特定のロガーのみ、他のappenderに出力する

ログ全てではなく、ある特定のロガー出力だけ別にしたい場合は
そのloggerにappender-refを加える。

<logger name="javazuki.DoubleAppenderTest">
  <appender-ref ref="LOG_FILE" />
</logger>
   
<root level="debug">
  <appender-ref ref="STDOUT" />
</root>

このとき、
レベルを指定する場合
rootで出力される内容もそのレベルが適用される

ことに注意する。

例えば次の設定では、
「javazuki.DoubleAppenderTest」ロガーは
infoレベル以上が「LOG_FILE」と「STDOUT」に出力される。

<logger name="javazuki.DoubleAppenderTest" level="info">
  <appender-ref ref="LOG_FILE" />
</logger>
   
<root level="debug">
  <appender-ref ref="STDOUT" />
</root>

解釈としては「levelのフィルタリングとappenderの設定がそれぞれ独立している」ってこと。
よって、levelのフィルタリングがrootの方にも適用される。
(loggerのlevelが子要素のappendar-refにのみ適用されるわけではない。)

ケース3.特定のロガーのみ、別のappendarのみに出力する

今までのパターンではrootのappenderにも出力していた。
今度は、rootのappenderには出力せず、指定したappenderのみに出力する方法。

このとき、additivity="false"を使う。

次の設定では、
「javazuki.DoubleAppenderTest」ロガーは
infoレベル以上が「LOG_FILE」のみに出力されます。

<logger name="javazuki.DoubleAppenderTest" level="info" additivity="false">
  <appender-ref ref="LOG_FILE" />
</logger>
   
<root level="debug">
  <appender-ref ref="STDOUT" />
</root>

additivity="false"の意味は、
そのロガーはそれより上階層のロガーの設定に加わらない(独立する)
ということ。

つまり、
「jp.doorblog.DoubleAppendarOutputTest」ロガーは、
上階層の「root」の設定には加わらないので、「STDOUT」には出力されない
ことになる。

ちなみに、このときのlevelは結果的に子要素のappender-refのみに適用となる。

PR