normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure ログ講座第一弾 〜Windows Azure logs〜

皆様、Windows Azure ログ機能を活用しているだろうか。ログ機能が存在しているのは知っているが、利用していない人が多いのではないだろうか。私主観として、Windows Azureのログが活用されない理由は以下だと考えている。

  • Windows Azure SDKがCTP版からv1.0 Novemberになった際、ログ機能が大幅に変更されて良く分からなくなったため
  • デフォルトテンプレートの設定ではログが出力されないため
  • ログが出力される場所はWindows Azureストレージ・サービス(以下、単にストレージ・サービス)であり、専用のビュアーが少ないのでログ機能を利用するメリットが少ないため

Windows Azure ログ機能の利点は分かりにくいかも知れないが、Windows Azureで動的スケールを実現する場合、アプリケーションの診断をする場合、アプリケーションの動作証跡をとる場合と、例をあげれば枚挙に暇がない。是非一緒にWindows Azureログ機能を学習して頂きたい。

Windows Azureログ機能の概要

Windows Azureログ機能は、他のログシステムと若干毛色が異なるのだが、まずは以下の図を見て頂きたい。

Windows Azureのログは、最初に一旦ロールインスタンス内のローカル・ディレクトリ・ストレージに蓄えられる。しかし、この時点でアプリケーション開発者はログを確認する事は出来ない。ログの内容を参照するためには、ローカル・ディレクトリ・ストレージからストレージ・サービスに転送する処理を追記する必要がある。
また、ストレージ・サービスにログを転送する方法は「定期的にログをストレージ・サービスに転送する方法」と「アプリケーション側で指定したタイミングでログをストレージサービスに転送する方法」の二つが存在する。

Windows Azure logsを出力する

今回は「Windows Azure logs」を「定期的にログをストレージ・サービスに転送する方法」を実装する。理解する必要のあるクラスは「WebRole.cs」と「Default.aspx.cs」だ。

  • WebRole.cs(抜粋)

まず、Webロールのエントリポイントとなる「WebRole.cs」のソースを解説する。

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

            //Windows Azureトレース・ログを20秒単位で定期的に転送する
            config.Logs.ScheduledTransferPeriod = System.TimeSpan.FromSeconds(20);

            //Windows Azureトレース・ログを全て出力する
            config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Undefined;

            //Windows Azure診断ログの出力開始
            DiagnosticMonitor.Start("DiagnosticsConnectionString", config);

            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
            RoleEnvironment.Changing += RoleEnvironmentChanging;

            return base.OnStart();
        }

日本語のコメント部分が私が追記した箇所となる。デフォルトテンプレートの設定では、蓄えたログをストレージ・サービスに転送する機能が有効になっていない。このため、「ログ出力を行ってもストレージ内にログが存在しない」という現象が発生する。Windows Azureのログ機能を利用する場合、必ず「DiagnosticMonitor.Start」メソッドの引数にログ出力の設定を行ったインスタンスを渡す必要がある。

  • Default.aspx.cs(抜粋)
    public partial class _Default : System.Web.UI.Page
    {
        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            String msg = TextBox1.Text;
            switch (DropDownList1.Text)
            {
                case "Error":
                    System.Diagnostics.Trace.TraceError(msg);
                    break;
                case "Warning":
                    System.Diagnostics.Trace.TraceWarning(msg);
                    break;
                case "Information":
                    System.Diagnostics.Trace.TraceInformation(msg);
                    break;
                default:
                    System.Diagnostics.Trace.TraceError("Unknown log type");
                    return;
            }
        }

上記を見て頂ければ分かるが、通常の「System.Diagnostics」名前空間のクラスを利用してログ出力している。

ログの確認

Windows Azure log」はテーブル・ストレージに出力される。Azure Storage Exploreを利用して内容を参照した。

画像を確認いただければ分かると思うが、「WADLogsTable」テーブルが作成されている。同テーブル内にWindows Azureのログが出力されているのが確認できるだろう。「Level」はログレベル(WARN、ERROR等)を表し、「Message」部分にアプリケーション側で記述したメッセージが出力されている。
アプリケーションの動作確認時に「なかなかログがストレージ・サービスに転送されない」と不安に思う事も有ると思うが、20秒周期でログ転送をおこなっている事に注意して頂きたい。