はじめに
ログファイルの出力方法は標準APIのLoggerを使用しを使用したり、log4jというライブラリを使用したりと様々ありますが、最近はslf4jとlogbackというライブラリを組み合わせて使用することが多いので、これらを用いたログ出力方法を解説します。
本記事の内容
■ slf4jとlogbackを利用したログファイル出力方法
Contents
環境
今回のサンプルプログラムで使用する環境
IDE:eclipse
Javaバージョン:8
logback:1.2.3
slf4j:1.7.25
フォルダ構成
今回のサンプルプログラムのフォルダ構成は以下の通りです。
ライブラリの取得
まず、SLF4jとlogbackというライブラリを取得します。
以下のサイトへアクセスし、赤枠のzipファイルをダウンロードしてください。
ダウンロードしたら、解凍します。
解凍すると以下のようなフォルダ構成となっております。
今回使用するのは赤枠のjarファイルとなります。
上記赤枠のjarファイルをlibフォルダへコピーしてください。
コピーしましたら、次はコピーしたjarファイルへビルドパスを通します。
プロジェクトを右クリック>プロパティ>ビルドパスを選択してください。
すると、以下のようなWindowがでますので、「JARの追加」ボタンを押してください。
次に、以下のようなWindowに切り替わるので、先ほどコピーしたjarファイルを選択し、「OK」ボタンを押してください。
すると、さきほどのビルドパス設定画面に選択したjarファイルが表示されているので、適用して閉じます。
これで事前準備は完了です。
設定ファイルの作成
slf4jとlogbackというライブラリを組み合わせてログ出力するには、「logback.xml」というファイルを作成し、どこにどんな内容のファイルを出力するか定義してやる必要があります。
1. 変数宣言
logback.xmlはまずconfigurationタグで囲ってやる必要があります。
logback.xmlで変数宣言する場合は、propertyタグを使用し、以下のように記述します。
1 |
<property name="変数名" value="値" /> |
今回は、まずログの出力先(logDir)とログファイル名(fileName)を宣言します。
ログの出力先とログファイル名は任意の場所・名前でOKです。
1 2 3 4 |
<configuration> <property name="logDir" value="/Users/yamasakayuma/Desktop/" /> <property name="fileName" value="testlog" /> </configuration> |
2. ログメッセージのフォーマット
次に、どのようなフォーマットでログ出力するのか宣言します。
そのためには、変換指定子というものを使用します。
変換指定子の使い方は以下の通りです。
1 |
%<変換指定子>{オプション} |
オプションには、変換識別子ごとに固有の設定値を渡します。
例えば、日付を出力する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] | カッコ内の最小幅を意味し、最小幅に満たない場合は、右寄せして半角スペースでパディング。なお、最小幅をマイナスにすると、左寄せになる。 |
これらを利用して、今回は以下のようなフォーマットでログ出力されるよう変換指定子を使用して記述していきます。
1 2 |
2018/11/18 00:49:59.400 [INFO] [TestLog] メッセージ1 2018/11/18 00:49:59.402 [WARN] [TestLog] メッセージ2 |
1 2 3 4 5 6 |
<configuration> <property name="logDir" value="/Users/yamasakayuma/Desktop/" /> <property name="fileName" value="testlog" /> <!--今回追加する部分--> <property name="format1" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%-4p] [%c] %m%n" /> </configuration> |
3. ログ出力定義
ログをどこのファイルへ出力するかというのをタグと先ほど定義した変数(logDir/fileName)を使用して定義します。タグ以外の部分は毎回変わらないので、おまじないと思っていただいて結構です。
1 2 3 4 5 6 7 8 9 10 11 |
(省略) <property name="logDir" value="/Users/yamasakayuma/Desktop/" /> <property name="fileName" value="testlog" /> <property name="format1" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%-4p] [%c] %m%n" /> <!--今回追加する部分--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> (省略) |
4. ログ自動削除
logbackには特定の数ログが溜まったら過去のログから削除するという指定がタグを使用してできます。
今回30個ログが溜まったら過去のログから削除するという指定にしてあげましょう。
1 2 3 4 5 6 7 8 9 |
(省略) <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.log</fileNamePattern> <!--今回追加する部分--> <maxHistory>30</maxHistory> </rollingPolicy> </appender> (省略) |
5. フォーマットの定義
次にどういうフォーマットでログ出力するのかというのを先ほど定義した変数(format1)を使用して定義します。ここも「format1」のところ以外毎回変わらないので、細かい記載方法はおまじないと思っていただいて結構です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(省略) <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <!--今回追加する部分--> <encoder> <pattern>${format1}</pattern> </encoder> </appender> <!--今回追加する部分--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${format1}</pattern> </encoder> </appender> (省略) |
6. 出力するログレベルの指定
ログレベルは以下の5段階あるのですが、No1〜2はログ出力しないというような指定もできます。
No | レベル |
1 | TRACE |
2 | DEBUG |
3 | INFO |
4 | WARN |
5 | ERROR |
実装方法はrootタグで、出力ログレベルを指定します。
下記の例ではINFOレベルを指定しているので、INFO, WARN, ERRORレベルのログが出力され、DEBUGレベル以下のログは出力されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
(省略) <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${format1}</pattern> </encoder> </appender> <!--今回追加する部分--> <root level="info"> <appender-ref ref="FILE" /> <appender-ref ref="STDOUT" /> </root> </configuration> |
7. logback.xmlサンプル
最終系はこんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<configuration> <property name="logDir" value="/Users/yamasakayuma/Desktop/" /> <property name="fileName" value="testlog" /> <property name="format1" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%-4p] [%c] %m%n" /> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${format1}</pattern> </encoder> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${format1}</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="FILE" /> <appender-ref ref="STDOUT" /> </root> </configuration> |
ログ出力クラスの作成
次にログ出力サンプルクラスを作成します。
構文は以下の通りです。
1 2 3 4 5 |
// slf4jとlogbackを使用する宣言 private Logger logger = LoggerFactory.getLogger("クラス名"); // ログレベルとログに出力するメッセージを指定 ※staticなメソッド内では使用不可 logger.ログレベル("メッセージ"); |
構文にしたがって、今回は以下のようなログ出力サンプルクラスを作成します。
runLog()メソッドを作成し、それぞれのログレベルのメッセージを出力するような作りとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestLog { private Logger logger = LoggerFactory.getLogger("TestLog"); public void runLog() { logger.trace("test-trace"); logger.debug("test-debug"); logger.info("test-info"); logger.warn("test-warn"); logger.error("test-error"); } } |
メインクラスの作成
最後にログ出力クラスを実行するためのメインクラスを実装していきます。
実装は以下の通りです。
1 2 3 4 5 6 7 8 |
package main; public class Main { public static void main(String[] args) { TestLog test = new TestLog(); test.runLog(); } } |
以上で必要なプログラムの作成は完了です。
動作確認
Main.javaを右クリックし、実行>Javaアプリケーションの実行より実行してください。
指定した場所にログファイルができ、以下のように出力されていればOKです。
1 2 3 |
2018/11/18 03:07:28.657 [INFO] [TestLog] test-info 2018/11/18 03:07:28.659 [WARN] [TestLog] test-warn 2018/11/18 03:07:28.660 [ERROR] [TestLog] test-error |
なお、ログファイルが存在しない場合は新規に作成され、ログファイルが存在する場合は追記されます。
Javaエンジニアとしてよりスキルアップ
ここからはJavaエンジニアとしてよりスキルアップしたい方向けのおすすめ記事紹介となります。
JavaフレームワークのデファクトスタンダードであるSpringフレームワーク習得したいけど、何から手をつけたらよいかわからないという方。
以下の記事をお読みください。
また、無料で基礎からJavaを学びなおしたいという方は以下の記事を参考にしていただければと思います。
さいごまで読んでいただき、ありがとうございました。
知り合いから
「フリーランスエンジニアになれば、年収800万円以上の高報酬でかつ、自由な働き方をチョイスできる」
というのを聞いて、フリーランスエンジニアに興味を持ったのですが、
当時SIer企業でエンジニアをやっていたボクはなかなか一歩踏みだせませんでした。
というもの以下のような不安があったからです。
■フリーランスエンジニアってかなりの技術力がないとなれないのではないのか?
■フリーランスエンジニアって不安定なのではないのか?
■フリーランスエンジニアって人脈やコネ、営業力が必要なのではないのか?
しかし、実際にフリーランスエンジニアになってみて気づきました。
これらはすべて間違いです。
過去のボクのようにフリーランスエンジニアに興味あるけど一歩踏み出せないという方向けに
『フリーランスエンジニア転職完全ロードマップ』
という記事を書きました。
この記事読めば、どうすればフリーランスになれるのかが分かりますので、ぜひ一読ください。