Azure
Log4Net
AzureCloudServices

Webロールでもlog4net使いたい

More than 1 year has passed since last update.


はじめに

Webロールで出力したトレースログをWADLogsTableに転送する - Qiita

でトレースログが転送されるようになりましたが、出来ればlog4netで例外の情報なども含めて出力できた方が便利です。

log4netでトレースログを出力するには独自でアペンダを実装する必要がありますが、この記事ではそこはパスして、Webロールでlog4netを使う場合の問題について触れます。

前述の記事でも書きましたが、WebロールからはWeb.configが読めません。デフォルトではlog4netの設定も構成ファイルに書いているので、このままだとlog4netの初期化が行えません。


log4netの構成ファイルを独立させる

Web.configにlog4設定を書く場合、諸々省略するとこんな感じな書き方になると思います。

(TraceLogAppenderが独自実装したアペンダです。)


Web.config

<?xml version="1.0"?>

<configuration>
<configSections>
<section name="log4net" type=" log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<appender name="TraceLogAppender" type="Azure.Core.Log.TraceLogAppender, Azure.Core">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %5p - %m (%C:%M:%L)" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="TraceLogAppender" />
</root>
</log4net>
</configuration>

まずは、log4netの設定をlog4net.configとしてWeb.configから独立させます。


log4net.config

<?xml version="1.0"?>

<configuration>
<log4net>
<appender name="TraceLogAppender" type="Azure.Core.Log.TraceLogAppender, Azure.Core">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %5p - %m (%C:%M:%L)" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="TraceLogAppender" />
</root>
</log4net>
</configuration>

次に、log4net.configをファイルのプロパティから「出力ディレクトリにコピー」の項目を「新しい場合はコピーする」または「常にコピーする」にしておきます。

これでWebロールのベースディレクトリにlog4net.configが存在する状態になります。

そして、あとはlog4の初期化のときにこんな感じで、構成ファイルを明示的に指定することで、log4netの設定を読み込ませることができます。


log4net.configの読み込み

log4net.Config.XmlConfigurator.Configure(new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config")));


この方式にすればIIS側でもWebロール側でもlog4net.configを共通の設定として使うことができます。