使用方法(設定ファイル)
プログラムに記述したFatal
やDebug
などのログ出力メッセージを、どのようにして出力するかについては、構成ファイルと呼ばれるXMLファイルに記述します。構成ファイルはexe
名(dll名)+.config
からという名称で作成します(Visual Studio上は「App.config」という名前にて管理されます)。
ログの出力先「アペンダ(Appender)」の設定
log4netでは、アペンダ(ログ出力用クラス)を選択することによって、ログの出力先(ファイル・メール等)を変更することができます。以下の例では、ファイルに出力するため「log4net.Appender.FileAppender
」を「App.config」の<appender>
タグで指定しています。
<appender name="FileAppender" type="log4net.Appender.FileAppender"> <param name="File" value="Fileサンプル.log" /> <param name="AppendToFile" value="true" /> (中略) </appender>
これで「Fileサンプル.log」というファイルにログが出力されるようになります。
代表的なアペンダについて
なお、FileAppender
以外にも様々なアペンダがありますので、代表的なアペンダについて紹介します。
ADONetAppender
データベースに保存できるため、複数のAPサーバが存在する場合などには情報を一元管理できるというメリットがあります。しかし、データベースに接続できないときは、SMTPAppender
などと組み合わせて障害通知を行う必要があります。
ConsoleAppender
コンソールに出力を行う標準的なアペンダです。
EventLogAppender
イベントビューアというWindowsに付属のイベントログ監視画面にアプリケーションログを出力します。ただしローカルのPCにしかイベントを出力することができません。
FileAppender
ファイルにログを出力します。シンプルですがファイルサイズが大きくなりすぎる可能性があるため、RollingFileAppender
を使用することを推奨します。
NetSendAppender
Messenger
サービスにて動作するNetSend
コマンドを用いて、障害をダイレクトにユーザ通知することができます。
RollingFileAppender
ファイルにログを出力します。ファイルサイズや時刻によって自動的にログファイルの分割(切替)を行うことができるので、利用されることの多いアペンダです。
SMTPAppender
メール送信を行います。TO
に複数の指定はできますが、CC
やBCC
の指定は行えません。
UdpAppender
UDP(User Datagram Protocol)にてログ出力を行います。UDPの受け先としては、log4jのログビューアである「Chainsaw」等が指定できます。
なお、今回はWindowsアプリケーションのため紹介していませんが、ASPで使用可能なASPNetTraceAppender
というアペンダも存在します。また、アペンダによって設定できるパラメータが異なりますので、詳細についてはサンプルソースやlog4netのマニュアルをご覧ください。
レイアウト(Layout)の設定
log4netではプログラムに記述したメッセージだけではなく、日時・レベルといった付加情報も合わせて出力することができます。この機能のことをレイアウトと呼びます。
<appender name="FileAppender" type="log4net.Appender.FileAppender"> (中略) <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender>
この例では、<layout>
タグでパターンレイアウト「log4net.Layout.PatternLayout
」を指定し「ConversionPattern
」にて出力内容を定義しています。上記の設定の出力例は以下のようになります。
2005-04-25 04:51:33,453 [2096] FATAL Log4netSample.frmLog4netSample - log4netによるログ出力例~Fatal(致命的障害) 2005-04-25 04:51:33,453 [2096] ERROR Log4netSample.frmLog4netSample - log4netによるログ出力例~Error(障害) 2005-04-25 04:51:33,468 [2096] WARN Log4netSample.frmLog4netSample - log4netによるログ出力例~Warn(警告) 2005-04-25 04:51:33,468 [2096] INFO Log4netSample.frmLog4netSample - log4netによるログ出力例~Info(情報) 2005-04-25 04:51:33,468 [2096] DEBUG Log4netSample.frmLog4netSample - log4netによるログ出力例~Degug(デバッグ・トレース用)
設定したパターン「"%d [%t] %-5p %c - %m%n"
」の通りに「日付、スレッド、レベル、logger
名、メッセージ」が出力されていることがわかります。なお「%-5p
」というのは5文字以下の場合、右側に空白を入れる設定です。そのためWARN
やINFO
といった4文字のレベルのメッセージが表示されてもレイアウトが崩れなくなります(「%5p」というようにマイナスを指定しない場合は左側に空白が入ります)。PatternLayout
で指定できるパターンを表に整理しておきますので、出力したいメッセージに応じてConversionPattern
を設定すると良いでしょう。
パターン | 説明 |
%c | ログ出力が行われたlogger 名を出力。 |
%C | クラスを出力。 |
%d | 日時を出力。「%d{yyyy/mm/dd HH:mm:ss}」といった詳細指定も可能。 |
%F | ファイル名を出力。 |
%l | ソース名や行といった呼び出し位置を出力。 |
%L | 行番号を出力。 |
%m | メッセージを出力。 |
%M | メソッド名を出力。 |
%n | 改行文字を出力。 |
%p | ログのレベル(Fatal /Error など)を出力。 |
%t | ログを生成したスレッドを出力。 |
%x | スレッドのNDC(ネスト化診断コンテキスト) を出力。スレッド固有の情報(セッションIDなど)を埋め込むことができます。 |
なお、レイアウトには「SimpleLayout
(レベルとメッセージを表示)」や「XmlLayout
(Xml形式の出力)」など、幾つかの種類がありますが、たいていの場合、ログの整形が簡単なパターンレイアウトが採用されます。
出力対象「logger」の設定
log4netではlogger
の階層によってログの出力を制御することができます。
Log4netSample ├ MyTeam │ └ MyProgram └ OtherTeam
今回のサンプルの名前空間は下記のようになっています。そのため、自分のチームはWarn
レベル、他チーム分はFatal
、自分の担当プログラムはDebug
レベルで出力するといったことが可能になります。
<!-- 担当チームのログはWARN以上を出力。Fileにも出力 --> <logger name="Log4netSample.MyTeam"> <level value="WARN" /> <appender-ref ref="FileAppender" /> </logger> <!-- 他チームのログはFATAL以上を出力 --> <logger name="Log4netSample.OtherTeam"> <level value="FATAL" /> </logger> <!-- 担当プログラムのログはDEBUG以上を出力 --> <logger name="Log4netSample.MyTeam.MyProgram"> <level value="DEBUG" /> </logger>
このように<logger>
タグを用いlogger
の階層ごとにレベルとアペンダを設定することができます。レベルの指定には<level>
タグを指定し、アペンダの指定には<appender-ref>
タグが使用できます。またアペンダは複数指定できるため、一つのログメッセージを複数の出力先に送信することも可能です。
なお、logger
の階層はlogger
のインスタンスを取得するGetLogger
メソッドの引数で指定します。今回のサンプルでは「System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
」を呼び出しているためクラスの完全修飾クラス名とlogger
の階層が一致しています。
Rootの設定
最後に全体のデフォルトとなる設定を行います。
<root> <level value="ERROR" /> <appender-ref ref="ConsoleAppender" /> </root>
ログ出力のデフォルト設定は「Root(logger
階層の最上位の意味)」と呼ばれ、「App.config」の<root>
タグにて指定します。今回の例では、レベルをError
に設定し、コンソール出力用のアペンダを指定しています。