miso_soup3 Blog

主に ASP.NET 関連について書いています。

Web API のトレース機能を Azure で

前回、Web API のトレース機能がデフォルトで追加されたことについて書きました。
Web API のヘルプページとトレース機能がデフォルトへ
このトレース機能は、Azure に発行したとしても、問題の発見に役に立つことができます。

Azure に発行して、WEB API のトレース出力の内容を、
Azure トレース・ログ機能を利用して確認してみたいと思います。

VS Express 2012 for Web で完結できることにも注目です。
(※Azure のクラウドサービスと、ストレージの利用が必要になります。)

仕組み

Web API のトレースは、デフォルトでは、
System.Diagnostics.Trace クラスで出力を行っています。
SystemDiagnosticsTraceWriter

Azure には、ログをストレージ(ブロブ・テーブル)に出力する機能がありますので、
それを利用して、Web API のトレース結果をストレージ内に格納します。
(作業内容は Azure 周りだけになります)

Azure のログについては、業務システムでWindows Azureを使うための42の覚え書き ログなどの環境依存の機能
を参考にさせて頂きました。

クラウドサービスプロジェクトの追加

Web Platform Installer で Azure SDK をインストしておきます。

Web API のプロジェクトを追加した後、
プロジェクトを右クリックし、「Windows Azure クラウド サービス プロジェクトの追加」を選択します。

ストレージアカウントの設定

追加した クラウドサービスプロジェクトの、ロールフォルダ内の
Web ロールを右クリックし、プロパティをクリックします。

サービスの構成「Cloud」を選択し、
「診断」項目から、資格情報を設定します。

「Import」から、Azure の発行プロファイルを設定します。
(発行設定のダウンロードから取得できます。)

「OK」を押すと完了です。
ServiceConfiguration.Cloud.cscfg を開くと、ストレージのアカウント
情報が設定されていることが確認できます。

Web Role に設定を追加

ログをストレージに保存するよう設定します。

Web API プロジェクトに、WebRole.cs を追加します。
(クラス名は適当です)

Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint を継承させ、
以下の用に設定を記述します。

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;

namespace WebApiTrace
{
	public class WebRole : RoleEntryPoint
	{
		public override bool OnStart()
		{
			// ログ出力や診断情報を監視する構成を取得する
			DiagnosticMonitorConfiguration config =
			  DiagnosticMonitor.GetDefaultInitialConfiguration();

			// a)Windows Azureトレース・ログを1分単位で転送する
			config.Logs.ScheduledTransferPeriod =
			  System.TimeSpan.FromMinutes(1);

			// ログ出力レベルを設定
			config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Information;

			config.Logs.BufferQuotaInMB = 500;

			// Windows Azureの診断モニタ(=ログ出力)を開始する
			DiagnosticMonitor.Start(
			  "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);

			// 構成設定の変更イベントをハンドリングする
			RoleEnvironment.Changing += RoleEnvironmentChanging;

			return base.OnStart();
		}

		private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
		{
			// 構成設定が変更されたら、ロール・インスタンスを再起動する
			if (e.Changes.Any(change =>
				change is RoleEnvironmentConfigurationSettingChange))
			{
				e.Cancel = true;
			}
		}
	}
}

このコードは、先ほどご紹介した記事を参考にさせて頂きました。

WebConfig の編集

Web API のプロジェクトの「Web.config」に以下のコードを追加します。

<configuration>
	<system.diagnostics>

		<trace autoflush="true" indentsize="4">
			<listeners>
				<add name="AzureDiagnostics"
					 type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, 
					 Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
				</add>
				
			</listeners>
		</trace>

	</system.diagnostics> 
.....

Microsoft.WindowsAzure.Diagnostics のバージョンは場合によって
変更する必要があるかもしれません。

以上で設定は終了です。

発行

クラウドサービスプロジェクトを右クリックし、「発行」を選択します。
発行が終わった後は、サイトにアクセスし、
"~/api/values" にアクセスしてログを出力させておきます。

ストレージ内のログを見る

ログは、ストレージのテーブル「WADLogsTable」に保存されています。
ストレージ閲覧ツールから確認することもできますが、
VS Express 2012 for Web からも確認することができます。

「表示」>「データベースエクスプローラ」をクリックします。
下の用に、ストレージアカウントを追加します。

追加されたコンテナから、テーブルの「WADLogsTable」の
データを表示します。

すると、出力されたログ一覧が表示されます!

一番右の列、Message がログ本文です。

先ほどのWeb Role の設定だと、1分後に出力させているので、
"~/api/values" にアクセスした後しばらく待つ必要があります。

参考させて頂いたサイト

Azure ストレージって何?という方は、
初めてのWindows Azureテーブル・ストレージ開発
こちらがおすすめです。

How to: Store and View Diagnostic Data in Windows Azure Storage
Azure のログをストレージに出力する手順が記載されています。
ストレージ閲覧ツールについても。