「Log4J」と「SLF4J」ってなんだ?ログの出力先探索記
ことのきっかけ
お仕事でコンソールにバーって出てるけどログファイルはどこにあるんだろうと探していた時のことでした。
こんなのを見た、「Logger」だからログはいてくれるのでしょう。
import org.slf4j.Logger;
ログは見るけど出力とかよくわからない・・・いつもはBossや先輩に設定場所と内容の指示をもらってやっているだけ・・・ソフトウェアデザインの2017-03月号でも特集していた「ログ」・・・自分関わっているのだけでも知らなきゃ!となったのがきっかけでした。
「slf4j Logger」でググってみました。「SLF4J」は他のものと一緒に使われるようで、よく目にしたのが・・・
① 「Log4J」
Log4J は Jakarta プロジェクトで開発が進められている Java プログラム用のログ API です。Log4J を利用することで、様々なロギングが可能になります。
1. Log4J の基本 | TECHSCORE(テックスコア)
Log4J はロギングのためのクラス・ライブラリである。開発元は言わずと知れた Apache のサブプロジェクトの一つである。
www.nurs.or.jp
log4jはjavaで最もポピュラーなロギングフレームワークだと思います。
log4jだけでも良いのですが、SLF4Jを使うことでprintfライクな文法でログを出力できるところが気に入り利用することにしました。
yokuno.hatenablog.com
いろいろ読んでみてを理解しはじめました。
www.slideshare.net
www.bunkei-programmer.net
「SLF4J」はインターフェース的なログファサードライブラリ。
Facadeパターンは、既存のクラスを複数組み合わせて使う手順を、「窓口」となるクラスを作ってシンプルに利用できるようにするパターンです。
15.Facadeパターン | TECHSCORE(テックスコア)
「SLF4J(Simple Logging Facade For Java)」はいろんなログ出力ライブラリを切り替えて使うためのインターフェース的なもの。
だから実装的なライブラリと一緒に使うということになるのですね。
で、結局出力するログの出力先はどこなんでしょう?
① ログ出力ライブラリを調べる
ライブラリなのでまずはMavenさんのpom.xmlをみてみました。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.x.x</version> </dependency>
ぐぐったら実装的なログ出力ライブラリは「Log4j」のようでした。
② 設定ファイルを探す
「Log4j」の代表的な設定ファイル名は「log4j.properties」「log4j.xml」で、
このファイルがなかったらソースから追えば設定ファイルが見つかるようです。
設定ファイルを使用するには、org.apache.log4j.PropertyConfigurator クラスを使用します。クラスメソッドconfigure( ) メソッドで設定ファイルを読み込みます。
2. 設定ファイルの利用 | TECHSCORE(テックスコア)
③ 設定方法を知る
大きな構成は3つで「Loggerさん」「Appenderさん」「Layoutさん」
Logger は Log4J パッケージの中心クラスで、ロギングを行う部分をグループ化し、必要なグループのログだけを出力したり、カテゴリーに優先順位をつけることにより様々な出力方法を指定することができます。
Appender はログの出力先を指定するものです。Appender で設定できる出力先は、冒頭でも述べたように、ファイル、OutputStream、Java.io.Writer、リモート Log4J サーバ、リモート Unix Syslog デーモン、Windows NT イベントログなどです。
Layout はその名の通り、ログの出力フォーマットを指定するものです。単純なテキスト出力、ユーザが指定したレイアウト、HTML のテーブルレイアウトなどを指定することができます。
1. Log4J の基本 | TECHSCORE(テックスコア)
Logger
ここに「Loggerさんの名前」「ログレベル」「Appenderさんの名前」を設定します。
# RootLogger log4j.rootLogger={ログレベル},{Appenderさんの名前} # Logger log4j.logger.{Loggerさんの名前}={ログ出力レベル|INHERITED},{Appenderさんの名前}
RootLoggerのログレベルを継承したいときは、「INHERITED」と書きます。
↓Loggerさん
This is the central class in the log4j package. Most logging operations, except configuration, are done through this class.
Logger (Apache Log4j 1.2.17 API)
Appender
カンマ区切りで複数指定できます。複数指定できるのでログを、コンソールとファイルに同時に出力することが可能です。
gungnir-odin.hatenablog.com
Appener
Appenderさんの「クラス」「オプション」「使うLayoutのクラス」の設定をします。
# 使用するAPPENDERの設定 log4j.appender.{Appenderさんの名前}={Appenderさんのクラス} # オプションの設定 log4j.appender.{Appenderさんの名前}.{オプション}={オプションの設定値} log4j.appender.{Appenderさんの名前}.layout={使うLayoutさんのクラス}
↓{Appenderさんのクラス}は「All Known Implementing Classes:」から選びます。
Interface Appender
All Known Implementing Classes:
AppenderSkeleton, AsyncAppender, ConsoleAppender, DailyRollingFileAppender, ExternallyRolledFileAppender, FileAppender, JDBCAppender, JMSAppender, LF5Appender, NTEventLogAppender, NullAppender, RewriteAppender, RollingFileAppender, SMTPAppender, SocketAppender, SocketHubAppender, SyslogAppender, TelnetAppender, WriterAppenderImplement this interface for your own strategies for outputting log statements.
Appender (Apache Log4j 1.2.17 API)
- ConsoleAppender (Apache Log4j 1.2.17 API) : コンソールに出力
- SyslogAppender (Apache Log4j 1.2.17 API) : Syslogに出力
- ローカルでのデバックに使えると思ったら・・・
org.apache.log4j.net.SyslogAppender であることからも判るように、実際にはネットワーク系の Appender である。つまり、root でこれを使ったアプリを動かしても、ローカルマシンの syslog で取り扱って貰えるわけではない、ということを最初に言っておこう。
www.nurs.or.jp
- FileAppender (Apache Log4j 1.2.17 API) : ファイルに出力
- DailyRollingFileAppdender : 週や日時毎にファイル出力
- 書き方サンプルはこんな感じです >>> log4j.propeties の書き方
log4j.category.com.fc2web.himtodo.test=DEBUG, TEST log4j.appender.TEST=org.apache.log4j.DailyRollingFileAppender log4j.appender.TEST.File=C:/logs/test.log log4j.appender.TEST.DatePattern='.'yyyy-MM-dd log4j.appender.TEST.layout=org.apache.log4j.PatternLayout log4j.appender.TEST.layout.conversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS} [%p] - %m%n
↓{使うLayoutさんのクラス}は「Direct Known Subclasses:」から選ぶか実装します。
Class Layout
Direct Known Subclasses:
DateLayout, EnhancedPatternLayout, HTMLLayout, PatternLayout, SimpleLayout, XMLLayoutExtend this abstract class to create your own log layout format.
Layout (Apache Log4j 1.2.17 API)
他は見たら調べよう・・・覚えられないし・・・。