連載
» 2007年12月25日 00時00分 公開

連載:VBで実践! 外部コンポーネント活用術:オープンソースのロギング・サービス「log4net」を使う (3/4)

[岸本真二郎,デジタルアドバンテージ]

アペンダの設定例

 アペンダの設定を一から記述するのは大変なので、ここでは例として、日付ごとにファイルを作成するアペンダ、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>

リスト7 単一ファイルにログを出力するアペンダの設定例

■日付やサイズでファイルを分割

 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>

リスト8 日付ごとにファイルを生成するアペンダの設定例

■ログをメール送信

 ログをメール送信する場合は、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>

リスト9 メール送信を行うアペンダの設定例

■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]

リスト10 データベースにテーブルを作成するSQL文

 アペンダの設定では、このテーブル定義に対応する形で構成情報を作成します(リスト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>

リスト11 SQL Serverにログを挿入するアペンダの設定例

■Filter

 特定のアペンダでのみログのレベルを変更したい場合は、<appender>要素内に<filter>要素を加えることで、コントロールが可能です。例えばメールを送信するのはログ・レベルがFATALの場合のみと限定したい場合は、次のような要素を<appender>要素に追加します。

<filter type="log4net.Filter.LevelRangeFilter">
  <param name="LevelMin" value="FATAL" />
  <param name="LevelMax" value="FATAL" />
</filter>

リスト12 アペンダに個別のログのレベルを指定する<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.

編集部からのお知らせ

8月8日10時30分〜16時30分の間、システムメンテナンスのため記事の一部表示や資料のダウンロードができなくなります。ご理解のほどよろしくお願いいたします。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。