気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

log4jの設定書き方

commons-loggingと合わせて使うlog4jの設定方法がわかっていなかったので、まとめてみます。

1. 設定概要

設定ファイル:log4j.properties
配置場所:クラスパスの通ったパス。resourcesなど

log4j.xmlへの設定もできるが、今回はプロパティファイルに設定する前提記載していきます。

設定 説明
appender ログの出力先、出力方法の設定。Console、File出力が可能で、複数の出力先へ出力可能
layout ログ出力形式の指定。日付、ログレベル、ログ出力先のクラス名などをappender毎の設定
category categoryは、ログ設定単位。パッケージまたは、クラス単位で出力レベルの設定が可能

2. 基本的な設定方法

一般的な設定方法は、以下の通り

# カテゴリ
log4j.rootCategory = INFO, A1
log4j.category.org.aaa.myApp = DEBUG, A1
# アペンダー
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target = System.out
# レイアウト
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %d{HH:mm:ss,SSS} %-5p %c - %m%n

カテゴリ

log4j.rootCategory= ログレベル,アペンダ名1,アペンダ名2,・・・
log4j.category.カテゴリ名 = ログレベル,アペンダ名1,アペンダ名2,・・・

rootCategoryが親の設定。categoryの設定が、子設定で親の設定を継承します。
カテゴリ名の箇所に、パッケージ名やクラス名を指定。

アペンダー

log4j.appender.アペンダ名 = アペンダクラス名
log4j.appender.アペンダ名.プロパティ名1 = 設定値
log4j.appender.アペンダ名.プロパティ名2 = 設定値

アペンダクラス名に以下のようなクラスを設定する。

アペンダークラス 機能
org.apache.log4j.ConsoleAppender コンソールへログ出力
org.apache.log4j.FileAppender ファイルへログ出力
org.apache.log4j.DailyRollingFileAppender ファイルへログ出力する。日次ログローテ

log4j.appender.A1.Targetで出力内容を指定。
指定は、標準出力(System.out)or 標準エラー出力(System.err)

レイアウト

log4j.appender.アペンダ名.layout = レイアウトクラス名
log4j.appender.アペンダ名.layout.ConversionPattern = レイアウトパターン

レイアウトクラス名で、org.apache.log4j.PatternLayoutを指定することでユーザがレイアウト指定可能になります。
指定は、レイアウトパターンの箇所に設定。

3. 階層構造とログ伝播

一般的な設定例の内容を再度記載します。

# カテゴリ
log4j.rootCategory = INFO, A1
log4j.category.org.aaa.myApp = DEBUG, A1
# アペンダー
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target = System.out
# レイアウト
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %d{HH:mm:ss,SSS} %-5p %c - %m%n

rootCategoryが親、categoryがその子という階層ですが、
ロガーでは、子のアペンダーで設定したログ出力条件は、伝播するという仕組みを持っています。

そのため、アペンダーA1で設定した標準出力内容をコンソールに出力するという設定は、 org.aaa.myAppより上の階層でも適用されます。 これを回避したい場合は、以下の設定を追加します。

# カテゴリ
log4j.rootCategory = INFO, A1
log4j.category.org.aaa.myApp = DEBUG, A1
log4j.additivity.org.aaa.myApp = false # ← 追加
・
・

こうすると上の階層にA1アペンダーのログ設定は反映されません。 もちろん、上位で設定しているアペンダーがあればその設定は、有効です。

4. 押さえて置きたい設定

設定可能な便利なオプションは多数ありますが、2つだけ共有しておきます。

log4j.appender.名前=org.apache.log4j.SomeAppender
log4j.appender.名前.Threshold=INFO
log4j.appender.名前.encoding=UTF-8

Thresholdは、アペンダー単位のログレベルの指定。
標準出力はINFO、ファイル出力は、ERRORレベルまでを出力可能とするなどの設定が可能となる。
encodingは、アペンダーでの出力文字コード