読者です 読者をやめる 読者になる 読者になる

WebRole でログを Azure Storage Services に保存する方法メモ

.net

SDK 1.3 になってやり方が変わっていました。RoleInstanceDiagnosticManager を使って現在の設定を取得し、プロパティを色々変更して再び RoleInstanceDiagnosticManager にセットしないといけないみたい。

using System;
using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.Diagnostics.Management;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace Sample.WebRole
{
    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            ConfigureDiagnostics();

            RoleEnvironment.Changed += (sender, e) =>
            {
                if (e.Changes.Any(c => c is RoleEnvironmentConfigurationSettingChange))
                {
                    ConfigureDiagnostics();
                }
            };

            return base.OnStart();
        }

        private void ConfigureDiagnostics()
        {
            // Azure Storage Services 用の接続文字列名
            var cns = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";

            // アカウント作成
            var account = CloudStorageAccount.Parse(
                RoleEnvironment.GetConfigurationSettingValue(cns));

            // ログなどの設定を管理するオブジェクト取得
            var manager = account.CreateRoleInstanceDiagnosticManager(
                RoleEnvironment.DeploymentId,
                RoleEnvironment.CurrentRoleInstance.Role.Name,
                RoleEnvironment.CurrentRoleInstance.Id);

            // 現在の設定を取得
            var config = manager.GetCurrentConfiguration();

            // イベントログの設定と転送
            config.WindowsEventLog.DataSources.Add("Application!*");
            config.WindowsEventLog.DataSources.Add("System!*");
            config.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
            config.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

            // 診断ログの設定と転送
            config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
            config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

            // IIS ログの転送
            config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

            // Windows Azure ログの設定と転送
            config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
            config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

            // 設定を更新
            manager.SetCurrentConfiguration(config);
        }
    }
}

あと、海外のサンプル見ると FromConfigurationSetting ではなく Parse を使って CloudStorageAccont を生成しているのが多いですね。FromConfigurationSetting だと事前に SetConfigurationSettingPublisher を呼び出して準備が必要なのに対し、Parse の方はそれが不要だからでしょうか。

正直「FromConfigurationSetting も Parse 同様に準備無しで使えるようになればいいのに」って、エラーが出るたびに思います。