6

DiagnosticMonitorTraceListenerを一般的なトレースリスナー(主にASP.NET Health Monitoring用)として使用しているほか、例外処理用のEnterpriseLibrary5リスナーとして使用しています。これはAzureで実行する場合はうまく機能しますが、最小限の変更でAzureの外部でWebサイトを実行できることが重要です。

1つのオプションは、次のように動的に登録することです。

protected void Application_Start()
{
    if (Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable)
    {
        System.Diagnostics.Trace.Listeners.Add(new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());
        System.Diagnostics.Trace.AutoFlush = true;
    }
}

これは、ASP.NET Health MonitoringおよびSystem.Diagnosicsの一般的な使用では機能しますが、次のハードコードされた構成があるEnterpriseLibraryでは機​​能しません。

  <categorySources>
    <add switchValue="All" name="General">
      <listeners>
        <add name="Event Log Listener" />
        <add name="Azure Diagnostics Trace Listener" />
      </listeners>
    </add>
  </categorySources>

アドレス指定しないままにすると、ExceptionPolicy.HandleExceptionを呼び出すと次のものが生成されます。

ホストされたサービスまたは開発ファブリックで実行されていません。

アプリの実行場所に基づいてこれを条件付きで削除するには、EL5用の流暢な構成APIを使用できますが、構成を書き直す必要があります(すべてまたはまったくありません)。

web.config変換を使用することもできますが、3つの異なるソリューション構成(開発、ステージング、本番など)に加えて、dev-standaloneとdev-azureを区別するために4番目を導入する必要があります。

最後のオプションは、すべてのメッセージを** **(Azureで実行している場合)にルーティングするか、何もしないカスタムリスナーを作成することです。

他に何か提案はありますか?

参考までに、ASP.NETヘルスモニタリングは次のように構成されています。

<healthMonitoring enabled="true">
  <providers>
    <add name="TraceWebProvider" type="System.Web.Management.TraceWebEventProvider" />
  </providers>
  <rules>
    <add name="Application Events"
         eventName="Application Lifetime Events"
         provider="TraceWebProvider"
         profile="Default"
         minInstances="1"
         maxLimit="Infinite"
         minInterval="00:01:00" />
  </rules>
</healthMonitoring>
4

1 に答える 1

2

DiagnosticMonitorTraceListener を作成し、それをカテゴリの TraceSources のコレクションに追加できます。

EntLib 構成から Azure Diagnostics トレース リスナーを削除します。

  <categorySources>
    <add switchValue="All" name="General">
      <listeners>
        <add name="Event Log Listener" />
      </listeners>
    </add>
  </categorySources>

次に、以下のコードを使用して実行時に追加します。

protected void Application_Start()
{
    if (Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable)
    {
        LogSource logSource;
        Logger.Writer.TraceSources.TryGetValue("General", out logSource);
        logSource.Listeners.Add(new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());
    }
}
于 2012-01-06T01:08:40.140 に答える