log4netのWebアプリへの導入手順
Visual Studio.NET 2005 で ASP.NET2.0 のアプリにlog4netを組み込む手順。
1. DLL追加
ソリューションエクスプローラでプロジェクトを右クリックして
ASP.NETフォルダの追加−Bin
を選択し、Binフォルダを作成する。
そこにlog4net.dllを入れるとプログラムから参照可能になる。
2. log4net初期化
コンソールアプリであれば AssemblyInfo.cs に
を追加するのだが、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で
ということは、本番環境では行番号が取れないのは仕方ないのかな?