アペンダの設定を一から記述するのは大変なので、ここでは例として、日付ごとにファイルを作成するアペンダ、SQL Serverにログを記録するアペンダ、メールを送信するアペンダの設定例を紹介します。
■単一のファイルに出力
繰り返しになりますが、まず単一のファイルにログを出力する場合は、アペンダのタイプとして「log4net.Appender.FileAppender」を指定します。出力するファイル名は、<param>タグに記述します。
ログ・ファイルを生成する際に気を付けなければいけない点は、ログ・ファイルを作成するフォルダにアプリケーションを実行するユーザーの書き込み権限があるかどうかです(特にWindows Vistaの場合)。ファイルのパスの指定には環境変数を参照することもできます。例えば生成するログ・ファイル名のパスに「${TMP}」と記述しておくと、環境変数「TMP」(通常なら「%USERPROFILE%\Local Settings\Temp」)が指すフォルダにファイルを作成します。
<appender name="LogFileAppender"
type="log4net.Appender.FileAppender" >
<!-- ファイル名を指定 -->
<param name="File" value="C:\log-file.txt" />
<!-- 追加書き込み -->
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<!-- ログの書式 -->
<param name="ConversionPattern" value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
■日付やサイズでファイルを分割
Webサイトのログなどで、ログ・ファイルのサイズが非常に大きくなって管理しにくい場合はファイルを自動的に分割することができます。
アペンダであるlog4net.Appender.RollingFileAppenderでは、指定されたサイズによってファイルを分割するか、日付ごとにファイルを分割するか、もしくはその両方を行うかを指定できます。ただし月ごとに分割するというのはできないようです。
以下の設定では、ユーザーの一時フォルダに、「Log4netSample.20071212.log」といった名前のログ・ファイルが生成されるようになります。
<appender name="RollingLogFileAppender"
type="log4net.Appender.RollingFileAppender">
<!-- ログ・ファイル名の先頭部分 -->
<param name="File" value="${TMP}\Log4netSample" />
<!-- 追加書き込み -->
<param name="AppendToFile" value="true" />
<!-- 日付ごとにファイルを作成することを指定 -->
<param name="RollingStyle" value="date" />
<!-- ログ・ファイル名が固定ではないので“false”を指定 -->
<param name="StaticLogFileName" value="false" />
<!-- ファイル名の日付部分 -->
<param name="DatePattern" value='"."yyyyMMdd".log"' />
<layout type="log4net.Layout.PatternLayout">
<!-- ログの書式 -->
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
■ログをメール送信
ログをメール送信する場合は、log4net.Appender.SmtpAppenderを使用します。SMTPサーバ、送信元および送信先のメールアドレス、そしてログの内容(ConversionPattern)を指定します。送信されるメールの文字エンコードはUTF-8となります。log.Debug(……)といった1回のログ出力が必ず1通のメールで送信されるわけではなく、1通のメールには複数のログ・メッセージが含まれます。
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<!-- 送信先メールアドレス -->
<to value="to@domain.com" />
<!-- 送信元メールアドレス -->
<from value="from@domain.com" />
<!-- 件名 -->
<subject value="test logging message" />
<!-- メール・サーバ -->
<smtpHost value="SMTPServer.domain.com" />
<!-- メールを送信する際のバッファのサイズ -->
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
■SQL Serverにログを記録
ログをSQL Serverに記録する場合は、まずSQL Serverにログを格納するためのテーブルを用意しておく必要があります。適当なログ格納用のデータベースを作成し、そこにテーブルを作成します。
ここでは、tblLogsという名前のテーブルを作成して、ID、UserName、Date、Thread、Level、Logger、Messageというカラムを作成します。次のSQL文はこのテーブルを作成するためのスクリプトです。
CREATE TABLE [dbo].[tblLogs] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [varchar] (100) NULL ,
[Date] [datetime] NULL ,
[Thread] [varchar] (255) NULL ,
[Level] [varchar] (20) NULL ,
[Logger] [varchar] (255) NULL ,
[Message] [varchar] (4000) NULL
) ON [PRIMARY]
アペンダの設定では、このテーブル定義に対応する形で構成情報を作成します(リスト11)。カラムの指定部分の記述が長くなりますが、log4net.Appender.AdoNetAppenderというタイプのアペンダを使い、ADONetAppender_SqlServerというアペンダ名を定義しています。
<connectionString>要素には接続情報を記述しますので、環境に応じてこの接続文字列を修正します。さらに<commandText>要素にINSERT文を指定し、ここで記述されている各SQLパラメータに対して、挿入するカラムの内容を<parameter>要素で述します。
<parameter>要素では、テーブルに挿入するカラムと、log4netが提供する日付やスレッドID、ログ・レベルなどのパターン(「%」で始まる)の対応付けを行います。後述するようにlog4netにはさまざまなレイアウト(書式)のパターンがあります。ユーザーに配布したアプリケーションからデータベースにログを出力する場合は、ユーザー名(%username)のカラムを用意しておくとエラー発生時の状況特定に役立ちます。
<appender name="ADONetAppender_SqlServer"
type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<!-- ここは決めうち -->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!-- 接続文字列 -->
<connectionString value="data source=(local);initial catalog=log4Net;integrated security=false;persist security info=True;User ID=sa;Password=sa" />
<!-- INSERT文を指定 -->
<commandText value="INSERT INTO tblLogs ([UserName],[Date],[Thread],[Level],[Logger],[Message]) VALUES (@username,@log_date, @thread, @log_level, @logger, @message)" />
<!-- カラム情報 -->
<parameter>
<!-- INSERT文に含まれるパラメータ -->
<parameterName value="@username" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<!-- パターンを指定 -->
<conversionPattern value="%username" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
■Filter
特定のアペンダでのみログのレベルを変更したい場合は、<appender>要素内に<filter>要素を加えることで、コントロールが可能です。例えばメールを送信するのはログ・レベルがFATALの場合のみと限定したい場合は、次のような要素を<appender>要素に追加します。
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
</filter>
■ログの書式(Layout)
すでに<conversionPattern>という要素が<appender>要素に記述されているのを目にしていると思いますが、<conversionPattern>要素でログの書式を指定します。
この書式には、次の表2に示す変換パターンを利用します。ちなみに親要素の「<layout type="log4net.Layout.PatternLayout">」は、ログ出力を通常のテキストで出力することを指示しています。このtype属性に「log4net.Layout.XmlLayout」を記述した場合は、ログ・ファイルがXML形式で生成されます。
パターン | 内容 |
---|---|
%literal | リテラルを表示(「%」を出力する場合など) |
%newline | 改行 |
%n | |
%c | ロガー名 |
%logger | |
%C | 実行中のクラス名 |
%class | |
%type | |
%d | 現在の日付($d{yyyy年MM月dd日}) |
%date | |
%exception | 例外情報 |
%F | ファイルのパス |
%file | |
%l | メソッド名とファイル名および行番号 |
%location | |
%L | 行番号 |
%line | |
%m | メッセージ |
%message | |
%M | メソッド名 |
%method | |
%p | ログのレベル |
%level | |
%r | アプリケーションの経過時間 |
%timestamp | |
%t | スレッドID |
%thread
%a | 実行ファイル名 |
---|---|
%appdomain | |
%u | 現在のコンテキストのユーザー名 (System.Threading.Thread.CurrentPrincipal.Identity.Nameの値がセットされる) |
%identity | |
%utcdate | UTC日付 |
%utcDate | |
%UtcDate | |
%w | ユーザー名 |
%username
表2 ログ出力時の変換パターン一覧 多くのパターンには短い形式(%newlineに対する%nなど)が用意されている。 |
Copyright© Digital Advantage Corp. All Rights Reserved.