はじめに
Azureクラウドサービスにはトレースログをテーブルに転送機能があります。
この機能で昔から微妙なのが、Webロール内で出力したログについては転送されないことです。
トレースログを転送するリスナーの設定はWeb.Condigに、下記のように書いてあります。
<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics" initializeData="603db610-7a5f-4f96-a49a-297659a92795">
<filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>
ところが、WebロールはIIS上で動いているわけではない(という表現であっているのだろうか)ので、Web.configを読むことができません。
結果的に、リスナーがセットされないために、Webロール内でいくらトレースログを出力してもAzureテーブルには転送されません。
対応策(Azure SDK 2.4まで)
今さら、Azure SDK 2.4以前のことを書くのも微妙なのですが・・・
2.4までは次のようにOnStart()のDiagnosticMonitorTraceListenr()を追加すれば、Webロールからもトレースログを転送できました。
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
Trace.Listeners.Add(new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());
// 以下略
}
}
対応策(Azure SDK 2.5~2.9)
Azure SDK 2.5から、DiagnosticMonitorTraceListenerの基底クラスが以下のように変更になりました。
Azure SDK | 基底クラス |
---|---|
?~2.4 | System.Diagnostics.TraceListener |
2.5~2.9 | Microsoft.Cis.Eventing.Listeners.RDEventMonitoringAgentListener |
DiagnosticMonitorTraceListenerはTraceListenerを継承しなくなったので、Azure SDK 2.4までのように単純に追加するわけにはいかなくなりました。
TraceListenerを継承する自作クラスでDiagnosticMonitorTraceListenerをラップ作成して・・・
というのをAzure SDK 2.9の環境で試しましたが全く転送されず、色々調べて辿りついたのがこの投稿です。
単純に、MonAgentListenerをアセンブリ参照に追加すれば、Azure SDK 2.5~2.9でも、同様にトレースリスナーにDiagnosticMonitorTraceListenerを追加することで、Webロール内のトレースログが転送されるようになりました。