Azure
ASP.NET
AzureCloudServices

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

More than 1 year has passed since last update.


はじめに

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の環境で試しましたが全く転送されず、色々調べて辿りついたのがこの投稿です。

Adding the trace listener in webroles.cs as the WebRole process is not configured by the web.config - Stack Overflow

単純に、MonAgentListenerをアセンブリ参照に追加すれば、Azure SDK 2.5~2.9でも、同様にトレースリスナーにDiagnosticMonitorTraceListenerを追加することで、Webロール内のトレースログが転送されるようになりました。