第1章 はじめに

やる気のもたらす効果には驚くべきものがある。例え簡単なシステムであろうとも、一つでも稼働しているシステムがあれば熱意は燃え上がる。新しいグラフィカルソフトウェアを使って、スクリーンに画像が表示されたなら、たとえそれが単純な四角形であったとしても、その効果は倍増する。システムを稼働させるまでのプロセス一つ一つにそういう瞬間があるものだ。チームが四ヶ月かけて何かを成し遂げたなら、きっとそれ以上に複雑なことが出来るほどに成長できることに気付かされたものだ。

—FREDERICK P. BROOKS, JR., The Mythical Man-Month

logbackとは何か?

Logback は巷で大人気の log4j プロジェクトの後継プロジェクトです。log4j の創始者であるCekiGülcü によって設計されました。強固で頑健なロギングシステムの十年間に及ぶ経験に基いて設計、構築されています。おかげで、logback は既存のロギングシステムと比べてより高速で、より小さなフットプリントを持つようになりました。場合によってはその差は非常に大きなこともあります。同じくらい重要なのが、logback は他のロギングシステムには無い固有の便利なフィーチャを提供していることです。

最初のステップ

必要条件

logback-classic モジュールを動かす際は、クラスパス上に slf4j-api.jarlogback-core.jarlogback-classic.jar が配置されている必要があります。

logback-*.jar ファイルは logback の配布物に含まれていますが、 {0]slf4j-api-1.7.6.jar は別のプロジェクトである SLF4J の配布物です。

さあ、logback を使ってみましょう。

例1.1:ロギングの基本的なテンプレート( logback-examples/src/main/java/chapters/introduction/HelloWorld1.java
package chapters.introduction;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld1 {

  public static void main(String[] args) {

    Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
    logger.debug("Hello world.");

  }
}

HelloWorld1クラスは chapters.introduction パッケージに定義されています。最初に SLF4J の API である LoggerLoggerFactoryorg.slf4j パッケージからインポートしています。

main()メソッドの最初の行では、LoggerFactoryクラスの static メソッドである getLogger メソッドの返すLogger クラスのインスタンスを、logger変数に代入します。logger には "chapters.introduction.HelloWorld1" という名前が付けられています。次の処理では、引数として "Hello World" を渡して、logger のdebugメソッドを呼び出しています。これを一言で表すと、main メソッドでは、"Hello World" というメッセージの DEBUG レベルのロギングがある、と言えます。

上記の例では、logbackのクラスを一つも参照していないことに注意してください。ほとんどの場合、ロギングは本来の仕事ではないので、あなたのクラスでは SLF4J のクラスをインポートするだけでよいのです。このように、全てではないにしても、あなたのクラスの大半はSLF4J APIを使用するだけで、logbackの存在には気づかないでしょう。

このサンプルアプリケーション(chapters.introduction.HelloWorld1)は次のコマンドで実行することができます。

java chapters.introduction.HelloWorld1

HelloWorld1アプリケーションを実行すると、コンソールに何かが一行出力されます。logbackのデフォルトの設定ポリシーにより、デフォルトの設定ファイルが見つからない場合はルートロガーにConsoleAppenderを割り当てるようになっています。

20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.

logback は組み込みの状態管理システムによって、内部状態をレポートすることができます。StatusManagerと呼ばれるコンポーネントを通じて、logback が有効になってから発生した重要なイベントの回数にアクセスすることができます。しばらくは、StatusPrinter クラスのprint()メソッドによって logback の内部状態を出力することにします。

例:ロガーの内部状態を出力する( logback-examples/src/main/java/chapters/introduction/HelloWorld2.java
package chapters.introduction;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;

public class HelloWorld2 {

  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");
    logger.debug("Hello world.");

    // print internal state
    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    StatusPrinter.print(lc);
  }
}

HelloWorld2アプリケーションを実行すると次のように出力されます。

12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
12:49:22,076 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.

これは、logback が設定ファイルである logback-test.xmllogback.xml を見つけられなかったことを意味しています(詳しくは後述します)。そして、デフォルトポリシー(基本的なConsoleAppenderを使います)を使うように自分自身を設定しています。Appenderとは、出力先として使用されるクラスのことです。既存のアペンダーには、コンソール、ファイル、Syslog、TCPソケット、JMSなどをいろいろな出力先のクラスが存在します。ユーザーは自分たちの状況に応じたアペンダーを簡単に作ることができます。

異常が起きた場合、内部状態を自動的にコンソールに出力するようになっています。

前の例はかなり単純なものでした。とはいえ、大きなアプリケーションで行われている実際のロギングもそんなに大きく変わるものではありません。一般的なロギング文の形式は変わらないでしょう。違うとしたら設定処理ですね。しかし、必要に応じたカスタマイズや設定をしたくなるでしょう。logbackを設定する方法については、以降の章で説明します。

前述した例では、StatusPrinter.print()メソッドによって内部状態を出力するように命令していることに注意してください。logback の内部状態は、logback に起因する問題を調査するために非常に役立ちます。

あなたのアプリケーションでロギングを有効にするための手順は次の三つです。

  1. logback の環境を準備します。やり方はさまざまです。詳細は後述します。
  2. ロギングをしたい全てのクラスで、org.slf4j.LoggerFactorygetLogger()メソッドによってLoggerのインスタンスを取得しましょう。getLogger()メソッドにはクラス名やクラスオブジェクト自体を引数にしましょう。
  3. logger インスタンスのロギング用メソッドを呼び出しましょう。debug() info() warn() error() といったものがあります。そうすれば、アペンダーとして設定した出力先にログが出力されます。

logbackをビルドする

logback はビルドツールとして Maven を使用しています。Maven はオープンソースのビルドツールで、広く利用されているものです。

Maven をインストールしたら、logback の配布物を展開して、展開先のディレクトリに移動します。そして mvn install コマンドを実行すれば、全てのモジュールがビルドされます。Mavenは必要な外部ライブラリを自動的にダウンロードします。

logback の配布物には完全なソースコードが含まれているので、編集して自分だけのバージョンのライブラリをビルドすることができます。あなたが修正したバージョンの logback は、LGPL ライセンス、もしくは、EPL ライセンスに従って再配布することもできます。

IDE から logback をビルドする場合はクラスパスの設定について説明したページを参照してください。