検索
連載

入門から実践までJavaで学べる「ログ」の常識プログラマーの常識をJavaで身につける(10)(2/4 ページ)

本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は、開発現場でのプログラミングやセキュリティに必須の「ログ」について具体的な出力の仕方や設定方法をじっくり解説します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

【入門1】はじめてのロギング

 まずは、java.util.loggingパッケージを使ったロギングを体験してみましょう。最も原始的なjava.util.loggingの利用例は下記のようになります。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ソースコードを細かく見ていきましょう。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 SampleLoggingという名前付きサブシステムのロガー(ログを出力するクラスのインスタンス)を取得します(ロガーには何か名前を付ける必要があります。ロガーに与える名前として、伝統的にFQCN(完全修飾クラス名)を利用することが多いです)。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ロガーに対して「INFOレベルでログメッセージを出力します(ログのレベルについては後述します)。

 このプログラムを実行すると、(Java実行環境インストールのデフォルト状態では)標準エラー出力に下記のようなメッセージが出力されます(ここでは、Eclipseのコンソールを例に取っています。標準エラー出力なので、赤色でメッセージが表示されています)。

図4 Eclipseコンソールへの標準エラー出力の表示例
図4 Eclipseコンソールへの標準エラー出力の表示例

 なお、ここで示した例では、ログファイルにはロギングされていません。ここでは、標準エラー出力のみにログ内容が出力されているにすぎないのです。

「ログレベル」って何?

 前の例では、ロギングのために何げなくinfoメソッドを呼び出していました。実は、このメソッドは「ログレベル」と関連付けられています。

 ログレベルは、文字通りログ出力制御のレベルを指定するために利用されます。ログ出力の際には、指定されたレベルによってフィルターが掛かる(指定されたレベルより下のログが出力されない)ような仕組みになっています。

 java.util.loggingパッケージでは、標準ログレベルのセットがjava.util.logging.Levelクラスで定義されています。ログレベルと対応するjava.util.logging.Loggerクラスの簡易メソッド、そしてそれぞれの意味は下記のような対応付けになっています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

【入門2】info以外のメソッドも使うには?

 それでは、info以外のメソッドを使ってみます。先ほどのログレベルの表で出てきたメソッドをすべて呼び出してみます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ところが、標準エラー出力にはinfo、warning、severeの3メソッドで呼び出したログ内容しか出力されないことが分かります。

実行結果(コンソール出力)

2007/11/26 14:41:49 SampleLogging2 main

情報: 生麦生米生卵。

2007/11/26 14:41:49 SampleLogging2 main

警告: あかまきがみ。

2007/11/26 14:41:49 SampleLogging2 main

致命的: すもももももももものうち。


 なぜなのでしょう? Java実行環境はデフォルト状態ではINFOレベルより下のレベルのログは出力されないようになっているからなのです。

はじめての「LogManager 構成プロパティ」の設定

 info、warning、severeの3メソッド以外で呼び出した際のログ出力も標準エラー出力に出てくるようにしたいのですが、それに先立ち、「LogManager 構成プロパティ」の設定を行います。java.util.loggingは、「LogManager 構成プロパティ」というものの設定に従って動作するようになっています。ここでは、最も単純な「LogManager 構成プロパティ」の設定方法を見ていきます。

 最も単純な設定方法は、プログラム内部から設定内容を与えてしまう方法です。環境など外部の影響を受けないので、最も簡単で確実に設定変更を与えることができます。

 まずは、Java実行環境のデフォルト状態に相当する設定内容を読み込む例を示します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 これを実行すると、標準エラー出力に下記のように表示されます。

実行結果(コンソール出力)

2007/11/26 15:00:53 SampleLogging3 main

情報: 生麦生米生卵。

2007/11/26 15:00:53 SampleLogging3 main

警告: あかまきがみ。

2007/11/26 15:00:53 SampleLogging3 main

致命的: すもももももももものうち。


 ここで、ソースコードを一部説明していきます。

 下記の個所は、java.util.loggingの設定情報をプロパティファイル形式で与える(「LogManager 構成プロパティ」)ための定数です。このプロパティファイル自体は、構成ファイルとも呼ばれます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 構成ファイルの内容をLOGGING_PROPERTIES_DATA定数にセットします。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ハンドラとして、java.util.logging.ConsoleHandlerクラスを設定しています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 フィルターする最低レベルをINFOに設定しています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ConsoleHandlerのフィルターするレベルを INFOに設定しています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ConsoleHandlerのフォーマッタをjava.util.logging.SimpleFormatterクラスに設定しています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 この個所では、先ほどの設定をjava.util.logging.LogManagerクラスのオブジェクトに与えています。設定された内容は「LogManager 構成プロパティ」と呼ばれます。なお、この設定変更はプログラムが動作しているJava VMプロセスそのものにも影響を与える点に注目してください。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ここで、ロガーオブジェクトを取得します。readConfigrationメソッドによって設定変更がされた後のロガーオブジェクトが取得されます。

 続いて次ページでは、ログの設定についてさらに解説します。

Copyright © ITmedia, Inc. All Rights Reserved.