Java

【Java】ログファイル出力方法

はじめに

今回はJavaを使用したログファイル出力方法についてご紹介します。

ログファイルの出力方法は標準APIのLoggerを使用しを使用したり、log4jというライブラリを使用したりと様々ありますが、最近はSLF4jとlogbackというライブラリを組み合わせて使用することが多いので、これらを用いたログ出力方法を解説します。

開発環境

以降、以下のバージョン、環境での解説となります。

IDE:eclipse
Javaバージョン:8

フォルダ構成

今回のサンプルプログラムのフォルダ構成は以下の通りです。

スクリーンショット 2018-11-18 0.51.35.png

ライブラリの取得

まず、SLF4jとlogbackというライブラリを取得します。
以下のサイトへアクセスし、赤枠のzipファイルをダウンロードしてください。

Logback公式サイト

スクリーンショット 2018-11-17 23.56.30.png

ダウンロードしたら、解凍します。

解凍すると以下のようなフォルダ構成となっております。
今回使用するのは赤枠のjarファイルとなります。

スクリーンショット 2018-11-17 23.58.52.png

上記赤枠のjarファイルをlibフォルダへコピーしてください。

コピーしましたら、次はコピーしたjarファイルへビルドパスを通します。
プロジェクトを右クリック>プロパティ>ビルドパスを選択してください。

すると、以下のようなWindowがでますので、「JARの追加」ボタンを押してください。

スクリーンショット 2018-11-18 0.01.35.png

次に、以下のようなWindowに切り替わるので、先ほどコピーしたjarファイルを選択し、「OK」ボタンを押してください。

スクリーンショット 2018-11-18 0.01.52.png

すると、さきほどのビルドパス設定画面に選択したjarファイルが表示されているので、適用して閉じます。

スクリーンショット 2018-11-18 0.02.05.png

これで事前準備は完了です。

設定ファイルの作成

SLF4jとlogbackというライブラリを組み合わせてログ出力するには、「logback.xml」というファイルを作成し、どこにどんな内容のファイルを出力するか定義してやる必要があります。

1. 変数宣言

logback.xmlはまずconfigurationタグで囲ってやる必要があります。
logback.xmlで変数宣言する場合は、propertyタグを使用し、以下のように記述します。

今回は、まずログの出力先(logDir)とログファイル名(fileName)を宣言します。
ログの出力先とログファイル名は任意の場所・名前でOKです。

2. ログメッセージのフォーマット

次に、どのようなフォーマットでログ出力するのか宣言します。
そのためには、変換指定子というものを使用します。

変換指定子の使い方は以下の通りです。

オプションには、変換識別子ごとに固有の設定値を渡します。

例えば、日付を出力するdateには%date{yyyyMMdd} のようにフォーマットを渡すことができます。

オプションなので、必要でなければ省略できます。

以下に、よく使いそうな変換指定子の使い方をまとめます。

変換指定子 使用例 実行結果例 説明
c %c sample.test ロガーの名前を出力
d %d{yyyy-MM-dd} 2018-10-18 日時を出力
m %m Hello world! ロガーに渡したメッセージを表示
n sample%n test sample<改行> test 改行
p %p INFO ログレベルを出力
t %t main ログ出力時のスレッド名を出力
[%数値] [%5p] [ INFO] カッコ内の最小幅を意味し、最小幅に満たない場合は、右寄せして半角スペースでパディング。なお、最小幅をマイナスにすると、左寄せになる。

これらを利用して、今回は以下のようなフォーマットでログ出力されるよう変換指定子を使用して記述していきます。

3. ログ出力定義

ログをどこのファイルへ出力するかというのをタグと先ほど定義した変数(logDir/fileName)を使用して定義します。タグ以外の部分は毎回変わらないので、おまじないと思っていただいて結構です。

4. ログ自動削除

logbackには特定の数ログが溜まったら過去のログから削除するという指定がタグを使用してできます。

今回30個ログが溜まったら過去のログから削除するという指定にしてあげましょう。

5. フォーマットの定義

次にどういうフォーマットでログ出力するのかというのを先ほど定義した変数(format1)を使用して定義します。ここも「format1」のところ以外毎回変わらないので、細かい記載方法はおまじないと思っていただいて結構です。

6. 出力するログレベルの指定

ログレベルは以下の5段階あるのですが、No1〜2はログ出力しないというような指定もできます。

No レベル
1 TRACE
2 DEBUG
3 INFO
4 WARN
5 ERROR

実装方法はrootタグで、出力ログレベルを指定します。

下記の例ではINFOレベルを指定しているので、INFO, WARN, ERRORレベルのログが出力され、DEBUGレベル以下のログは出力されません。

7. logback.xmlサンプル

最終系はこんな感じになります。

ログ出力クラスの作成

次にログ出力サンプルクラスを作成します。
構文は以下の通りです。

構文にしたがって、今回は以下のようなログ出力サンプルクラスを作成します。
runLog()メソッドを作成し、それぞれのログレベルのメッセージを出力するような作りとなっています。

メインクラスの作成

最後にログ出力クラスを実行するためのメインクラスを実装していきます。
実装は以下の通りです。

以上で必要なプログラムの作成は完了です。

動作確認

Main.javaを右クリックし、実行>Javaアプリケーションの実行より実行してください。

指定した場所にログファイルができ、以下のように出力されていればOKです。

■ testlog.yyyy-MM-dd.log

なお、ログファイルが存在しない場合は新規に作成され、ログファイルが存在する場合は追記されます。

# さいごに
少し前まではログ出力はlog4jが主流でしたが、最近はSLF4jとlogbackを見かけることが多くなりました。

logback.xmlの記述が最初は抵抗あるかもしれませんが、今回解説した記述方法さえ知っていれば大体なんとかなるかと思います。

今後Javaでログ出力処理を作る際やログ出力処理をSLF4jとlogbackへ切り替えるときにぜひ参考にしていただければと思います。