読者です 読者をやめる 読者になる 読者になる

「Log4J」と「SLF4J」ってなんだ?ログの出力先探索記

ことのきっかけ

お仕事でコンソールにバーって出てるけどログファイルはどこにあるんだろうと探していた時のことでした。
こんなのを見た、「Logger」だからログはいてくれるのでしょう。

import org.slf4j.Logger;


ログは見るけど出力とかよくわからない・・・いつもはBossや先輩に設定場所と内容の指示をもらってやっているだけ・・・ソフトウェアデザインの2017-03月号でも特集していた「ログ」・・・自分関わっているのだけでも知らなきゃ!となったのがきっかけでした。
「slf4j Logger」でググってみました。「SLF4J」は他のものと一緒に使われるようで、よく目にしたのが・・・

① 「Log4J

Log4JJakarta プロジェクトで開発が進められている Java プログラム用のログ API です。Log4J を利用することで、様々なロギングが可能になります。
1. Log4J の基本 | TECHSCORE(テックスコア)

Log4J はロギングのためのクラス・ライブラリである。開発元は言わずと知れた Apache のサブプロジェクトの一つである。
www.nurs.or.jp

log4jjavaで最もポピュラーなロギングフレームワークだと思います。
log4jだけでも良いのですが、SLF4Jを使うことでprintfライクな文法でログを出力できるところが気に入り利用することにしました。
yokuno.hatenablog.com

② 「Logback

Log4j の開発者が作った別のロギングライブラリ。

歴史的な背景とか、 SLF4J との関係については、 Javaのログ出力: 道具と考え方 というスライドがとても参考になります。
qiita.com

いろいろ読んでみてを理解しはじめました。

www.slideshare.net
www.bunkei-programmer.net

Log4J」「Logback」は実装的なログ出力ライブラリ。

「SLF4J」はインターフェース的なログファサードライブラリ。

Facadeパターンは、既存のクラスを複数組み合わせて使う手順を、「窓口」となるクラスを作ってシンプルに利用できるようにするパターンです。
15.Facadeパターン | TECHSCORE(テックスコア)

kiririmode.hatenablog.jp

「SLF4J(Simple Logging Facade For Java)」はいろんなログ出力ライブラリを切り替えて使うためのインターフェース的なもの。
だから実装的なライブラリと一緒に使うということになるのですね。


で、結局出力するログの出力先はどこなんでしょう?

① ログ出力ライブラリを調べる

ライブラリなのでまずはMavenさんのpom.xmlをみてみました。

f:id:ponsuke_tarou:20170423192410p:plain
2. Maven 入門 (2) | TECHSCORE(テックスコア)

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.x.x</version>
    </dependency>

ぐぐったら実装的なログ出力ライブラリは「Log4j」のようでした。

f:id:ponsuke_tarou:20170423193159j:plain
SLF4J - Javaロギング実装・ライブラリの柔軟な切り替え・効率化を実現するロギング Facade

② 設定ファイルを探す

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, WriterAppender

Implement this interface for your own strategies for outputting log statements.
Appender (Apache Log4j 1.2.17 API)

org.apache.log4j.net.SyslogAppender であることからも判るように、実際にはネットワーク系の Appender である。つまり、root でこれを使ったアプリを動かしても、ローカルマシンの syslog で取り扱って貰えるわけではない、ということを最初に言っておこう。
www.nurs.or.jp

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, XMLLayout

Extend this abstract class to create your own log layout format.
Layout (Apache Log4j 1.2.17 API)


他は見たら調べよう・・・覚えられないし・・・。