log4netのWebアプリへの導入手順

Visual Studio.NET 2005 で ASP.NET2.0 のアプリにlog4netを組み込む手順。

1. DLL追加

ソリューションエクスプローラでプロジェクトを右クリックして

ASP.NETフォルダの追加−Bin

を選択し、Binフォルダを作成する。
そこにlog4net.dllを入れるとプログラムから参照可能になる。

2. log4net初期化

コンソールアプリであれば AssemblyInfo.cs に

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

を追加するのだが、ASP.NETプロジェクトの場合は AssemblyInfo.cs がないので、代わりに Global.asax で log4net を初期化する。
プロジェクトを右クリックして

新しい項目の追加−グローバルアプリケーションクラス

を選択し、Global.asaxを作成する。
Session_Startを以下のようにする。

    void Session_Start(object sender, EventArgs e) 
    {
        // 新規セッションを開始したときに実行するコードです
        log4net.Config.XmlConfigurator.Configure();
    }

3. Web.config に log4net の設定を書き込む

の先頭に を追加。

<configuration>
	<configSections>
		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
	</configSections>

の末尾に を追加。
以下はWebアプリケーションの中の logs フォルダにログファイルを出力する例。

	<log4net>
		<!-- ファイルアペンダ(ローテーションあり) -->
		<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
			<param name="File" value="logs\xxxx.log"/>
			<param name="AppendToFile" value="true"/>
			<param name="MaxSizeRollBackups" value="10"/>
			<param name="MaximumFileSize" value="5MB"/>
			<param name="RollingStyle" value="Size"/>
			<param name="StaticLogFileName" value="true"/>
			<layout type="log4net.Layout.PatternLayout,log4net">
				<param name="ConversionPattern" value="%d [%t] %5p (%C:%M:%L) - %m%n"/>
			</layout>
		</appender>

		<root>
			<priority value="DEBUG"/>
			<appender-ref ref="RollingLogFileAppender"/>
		</root>
	</log4net>
</configuration>

4. ログ出力のコードを書く

using log4net;		// 1) 追加する
	
public class OrderDao : DaoBase
{
    // 2) ロガーを取得する
    private static ILog log = LogManager.GetLogger(typeof(OrderDao));

    public DataTable GeOrderDetails(string customerCode)
    {
    	// 3) 出力する
 	log.Debug("customerCode=" + customerCode);   
	...
    }
}

5. トラブルシューティング

ログファイルに何も書かれない。エラーも起きない

ログ出力先のフォルダについて、ASP.NETを実行するユーザ(ASPNETとか Network Serviceとか)に書き込み権限を与えていないと、こうなる。

ログ出力位置の行番号が全部 "0" になってしまう

下記の %L はログ出力位置の行番号に置換されるはずだが、

	<layout type="log4net.Layout.PatternLayout,log4net">
		<param name="ConversionPattern" value="%d [%t] %5p (%C:%M:%L) - %m%n"/>
	</layout>

実行してみると全部"0"になってしまうことがある。

2007-07-13 17:09:26,812 [1] DEBUG (OrderDao:GetOrders:0) - customerCode=4321
2007-07-13 17:09:26,812 [1] DEBUG (OrderDao:GetOrders:0) - select * from customer where customer_code=4321
2007-07-13 17:09:26,826 [1] DEBUG (OrderDao:GetOrders:0) - そんな顧客はいない

Web.configで にすると、この状態になる。
ということは、本番環境では行番号が取れないのは仕方ないのかな?