logback.xmlを設定する

有効レベルの決定ルールを把握して、「logback.xml」を設定しよう。

Logbackを利用する場合は「logback.xml」を作成して、「ログの出力先と出力のフォーマット」や「ロガー(クラス、パッケージ)ごとの出力レベル」を制御する。実はlogback.xmlなくても動くが、使いこなすにはもちろん設定した方がよい。

構成要素を把握する

「Appendar」「Logger」「Root」の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に指定されると初めて出力される ので注意する。

Appedarについてはコンソールやファイル出力など基本的なところは提供されているので、こだわりがなければそれを使う。設定のマニュアルも充実している。

<appendar>タグ

「どこに」「どんなレイアウト」で出力するのかを定義するときに<appendar>タグを追加する。

Table 1. <appendar>タグの属性
属性 必須 概要

name

appendar-refで指定されるこのAppendarの名前。好きな名前をつけていい。

class

Appender実装クラスの絶対クラス名。

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

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

提供されているAppendar

具体的にはこちらを参照→第4章 アペンダー(LOGBackマニュアル和訳)

Table 2. 提供されている主なApendarの一部
Appendar 概要

ConsoleAppender

コンソール

FileAppender

ファイル

RollingFileAppender

(ローリング)ファイル

SMTPAppendar

メール

DBAppender

DB

SyslogAppender

Syslog

RootとLoggerで出力制御をする

有効レベルの決定ルールを把握する

RootとLoggerの設定によって出力されるログレベルを制御できるが、ルールを把握してないとうまく制御できない。ルール自体は簡単。

どの有効レベルが適用されるかは各ロガーごとに決定され、ルールは次の通り。

  1. 直接loggerで指定されている場合は、そのlevel。

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

  3. 親パッケージも指定されていない場合は、rootのlevel。

Classクラスのインスタンスを引数でロガーを作成している場合にそのクラスの有効レベルは、一番具体的なlogger設定が適用され、全くなければRootが適用される。なので全体をログレベルだけ制御したいときはrootのlevelだけをいじればよい。

この制御をしやすくするために、ロガーにClassクラスのインスタンスを渡してロガーのインスタンスを生成している。こうしておくことでクラス名やパッケージ名でログの制御を行える。

あるパッケージでログレベルを制御していてその中の特定クラスだけは別のログレベルで出力したい場合は、そのクラスをnameに指定したloggerを作ることで可能。

<logger>タグ

出力制御を加える場合は、loggerタグを追加する。

Table 3. <logger>タグの属性
属性 必須 概要

name

対象となるロガー名(パッケージやクラス)。

level

このログレベル以上を出力する(このレベルより下を制限する)。大文字小文字を区別しない。

additivity

デフォルトはtrue。特定のロガーだけ、別のappendarにのみ出力するするときなどに利用する。

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

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

<root>タグ

必須要素。Loggerによる制御が無い場合は、Rootで指定したレベルで制御される。基本的にはLogger要素のように設定できるので、name="ROOT"という特別なLoggerと考えることができる。

Table 4. <root>タグの属性
属性 必須 概要

level

デフォルトはDEBUG。このログレベル以上を出力する(このレベルより下を制限する)。大文字小文字を区別しない。

loggerと同様に子要素に<appender-ref>を入れることで、出力先のAppendarを指定できる。

<root level="DEBUG">
  <appender-ref ref="STDOUT" />
</root>

Appendix A: 参考