logback.xmlで設定することをまとめる。

「logback.xml」では、次のことを設定する。

  • ログの出力先と出力のフォーマット
  • ロガー(クラス、パッケージ)ごとの出力レベルの変更

実はlogback.xmlなくても動くが、
使いこなすにはもちろん設定した方がよい。

ちゃんとした詳しい設定方法については
Logbackのマニュアル(→こちら)を参照。

具体的な要素(タグ)としては、
次の3種類。

種類 概要
Appendar 「どの場所に」「どんなレイアウト」で出力するのか
Logger 「このパッケージやクラス」は「どのログレベル」以上で出力するのか
Root Loggerで指定されないものについて、「どのログレベル」以上で「どのAppendar」に出力するのか

基本的にはこんな感じになる。

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

Appendar

「どの場所に」「どんなレイアウト」で出力するのかを定義する。

Appendarを定義しただけでは出力されず、
LoggerやRootに指定されると初めて出力される

ので注意する。

Appendarの実装クラスは、
たくさん用意されているのでそれを利用する(自作も可能)。

提供されている主なApendarの一部
Appendar 概要
ConsoleAppender コンソール出力
FileAppender ファイル出力
RollingFileAppender ファイル出力(ローリング可能)

実装クラスが決まれば、
nameを指定して出力するメッセージのパターンを決めればいい。

appenderタグの属性
属性 必須 概要
name このAppendarの名前。appendar-refで指定される。好きな名前をつけていい。
class Appender実装クラスの絶対クラス名。

appenderタグの子要素にあたるものはAppndarによってそれぞれ異なるので
マニュアル(→こちら)を参考にして設定する。

ConsoleAppenderでの例
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
  </encoder>
</appender>

Logger

ログの出力制御(フィルタリグ)を行う場合は、
Loggerを追加する。

loggerタグの属性
属性 必須 概要
name 対象となるロガー名(パッケージやクラス)。
level   このログレベル以上を出力する。(このレベルより下を制限する。)
additivity   デフォルトはtrue。
特定のロガーだけ、別のappendarにのみ出力するするときなどに利用する。

「chapters.configuration」というパッケージで
「INFO」以上で出力する場合の例

<logger name="chapters.configuration" level="INFO"/>

Loggerは子要素に<appender-ref>を入れることで、
そのロガーの出力先を指定できる。

<logger name="chapters.configuration" level="INFO">
  <appender-ref ref="LOG_FILE" />
</logger>

Root

Rootは、name="ROOT"というLoggerの一種。
1つだけしか定義できないので特別なLoggerという解釈。

ロガーの有効レベルの決定ルール上、
必ず定義されていないといけないものになる。
よって1つしか定義できないし、
定義しなくてもデフォルトが設定される。

Loggerが定義されないときはこのRootの設定が適用されるので、
ログレベルだけの制御ならAppendarとRootだけ定義すればよい。

rootタグの属性
属性 必須 概要
level   デフォルトはDEBUG。このログレベル以上を出力する。

子要素に<appender-ref>を入れることで、
出力先のAppendarを指定します。

「STDOUT」に出力する場合の例
<root level="DEBUG">
  <appender-ref ref="STDOUT" />
</root>

ロガーの有効レベルを把握する

rootとloggerによってログの出力制御をするが、
ロガーの有効レベルを把握した上で、
設定しないとたぶん混乱する。

どの有効レベルが適用されるかは
各ロガー(クラス名やロガーの名前)ごと決定され

それは次のルールに従って決まる。

  1. 直接loggerで指定されている場合は、そのlevel。
  2. 直接指定されていない場合は、
    logger指定されている一番直近(上)の親パッケージのlevel。
  3. 親パッケージも指定されていない場合は、rootのlevel。

Logbackは階層型ロガーなので、直接指定しなくても
階層(パッケージ)によって有効レベルが決定される。

これによって、(クラス名でロガーを取得していれば)
パッケージ単位でログレベルを制御できる。

また、このルールに従って考えると、
全体をログレベルだけ制御したいときは
rootのlevelだけをいじればよい。

その中で必要でない(フレームワークなどの)ログについては、
loggerなどで絞り込めばいい。

PR