第1章：はじめに

# 第1章 はじめに

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

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

## logbackとは何か？

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

## 最初のステップ

### 必要条件

logback-classic モジュールを動かす際は、クラスパス上に slf4j-api.jar と logback-core.jar と logback-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 である `Logger` と `LoggerFactory` を `org.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.xml と logback.xml を見つけられなかったことを意味しています（詳しくは後述します）。そして、デフォルトポリシー（基本的な`ConsoleAppender`を使います）を使うように自分自身を設定しています。`Appender`とは、出力先として使用されるクラスのことです。既存のアペンダーには、コンソール、ファイル、Syslog、TCPソケット、JMSなどをいろいろな出力先のクラスが存在します。ユーザーは自分たちの状況に応じたアペンダーを簡単に作ることができます。

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

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

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

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

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

## logbackをビルドする

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

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

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

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