これまでWindowsアプリケーションでのログ出力について説明してきました。log4netの構成はWindowsアプリケーションでもWebアプリケーションでも変わりませんが、ASP.NET 2.0の場合には、log4netの構成情報を別ファイルで用意しておくのが簡単です。
VBのWindowsアプリケーションの場合はapp.configファイルに構成情報を記述することで、ビルド後に実行ファイルと同じ名前に「.config」という拡張子の付いたファイルが生成されて、log4netは構成情報をそこから読み込みます(デフォルトの挙動)。これに対して、ASP.NET 2.0の場合は、(設定にもよりますが)ビルドを行っても実行形式のバイナリを生成しないので、log4netが構成情報を読み込めない場合があります。そのためASP.NET 2.0では構成情報を記述したファイルを別途用意し、そのファイルを読み込む方が確実です。
Webアプリケーションでは、以下の手順でlog4netの設定を行います。
Webアプリケーションのプロジェクトを新規作成した後、log4net.dllへの参照を追加します(Windowsアプリケーションの場合と同じ)。次にプロジェクトに「グローバル・アプリケーション・クラス(Global.asax)」を追加します。
そして、このGlobal.aspxに含まれる、アプリケーションのスタートアップ時に実行されるメソッドであるApplication_Startメソッドの中に、log4netの構成ファイルを指定するコードを記述します。これにより独自の構成情報を利用できるようになります。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' アプリケーションのスタートアップで実行するコードです
Dim rootPath As String = Me.Server.MapPath("/")
log4net.Config.XmlConfigurator.Configure( _
New System.IO.FileInfo(rootPath + "log4net.config"))
End Sub
構成ファイルの指定は絶対パスで行います。上記の例では、Webサーバのドキュメント・ルートに対応するパス(デフォルトでは「C:\InetPub\wwwroot」)にある構成ファイル(log4net.config)を読み込むように指示しています。
構成ファイルの中身は、ここまでにapp.configで記述した<log4net>要素をそのままコピーすればよいでしょう。ファイルの先頭にXMLの宣言を行うことと、日本語を記述する場合にはエンコードをUTF-8で行う(XML宣言に合わせる)ことを忘れないように。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender
name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log4net_log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern"
value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
ログの出力先としてファイルを指定する場合は、ASP.NETを実行しているアカウント(ASPNETもしくはNETWORK SERVICE)の権限と、ログの生成先フォルダの権限に注意する必要があります。
ASP.NETを実行しているアカウントに対する書き込み権限のないフォルダにログを作成する場合は、事前にフォルダのセキュリティ設定を変更(ASP.NETの実行アカウントに書き込み権限を与える)する必要があります。ファイル名にフォルダを指定しない場合(例えば「<param name="File" value="log4net_log.txt" />」)は、Webアプリケーションの仮想ディレクトリに対応するフォルダにファイルが作成されます。
ソース・コード上でのlogオブジェクトの取得や、ログを生成するメソッドは、Windowsアプリケーションの場合と同じです。
Partial Class _Default
Inherits System.Web.UI.Page
Private ReadOnly log As log4net.ILog = _
log4net.LogManager.GetLogger( _
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
log.Debug("ボタンが押されました")
End Sub
End Class
log4netは非常に高機能なログ生成ツールです。設定はちょっと複雑なのですが、最低限必要な設定さえ押さえておけば、とても便利に使用できます。
残念ながら日本語のドキュメントが用意されておらず、英文のドキュメントもリファレンス的な内容が乏しいのですが、そこはオープンソースのいいところで、不明な部分は直接ソース・コードを見てしまう(残念ながらC#で記述されていますが)ということもできます(実際、表2のレイアウトのパターンもソース・コードから取り出しました)。
log4netでログを作成する際に注意しておきたいのは、利用するログ・レベルについて基準をプログラム作成前にしっかりと決めておくことです。ソース・コード上に記述されたログ生成のコードを後から変更するのは大変ですから、無計画にDebug(……)やError(……)などを記述してしまっては、後になってログ・レベルを変更しても不要なログが生成され続け、ログの収集がかえって大変になってしまいます。
■Visual Studio 2008でも大丈夫?
現在配布されているlog4netに含まれるライブラリは .Net Framework 1.0、1.1および2.0用ですが、2.0用は英語版のVisual Studio 2008でも動作することは確認できました(サンプル・アプリケーションの動作範囲のみですが)。もちろんダウンロードしたアーカイブファイルにはソース・ファイルが含まれていますので、Visual Studio 2008でビルドして利用することも可能でしょう。
Copyright© Digital Advantage Corp. All Rights Reserved.