Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

ユーザ独自のログ採取

こんばんは、statemachineです。はてなを、WYSIWYGで編集できるエディタってあるんでしょうか。WordPressとかなら、WordとかLive Writerで画像貼り付けもできそうで、楽ちんそうなんですが。

さて、Azureフォーラムでも話題になっていたログの件のおさらいです。以前、Azureの小ネタでも、ココで触れています。

Blobに転送するログはすべて同じ仕組みで動作しているもようなので、IISのログもユーザーが独自に出力したログも同じような仕組みで転送されます。ようは、基点となるフォルダ配下まるごと転送されます。

以下のコードをWebRoleのOnStartで設定しておきまうす。もちろん、構成ファイルで、ローカルストレージの設定も必要です。

            var dmc = DiagnosticMonitor.GetDefaultInitialConfiguration();
            // 30秒単位で転送(実際はもっと長くする)
            dmc.Directories.ScheduledTransferPeriod = TimeSpan.FromSeconds(30);

            // カスタムログのコンテナをQuotaを設定
            var dconfig = new DirectoryConfiguration()
            {
                Container = "user-logs",
                DirectoryQuotaInMB = 100,
            };

            // LocalStorageのRootPathをログの基点フォルダとして設定
            var res = RoleEnvironment.GetLocalResource("ls");
            dconfig.Path = res.RootPath;

            // データソースに追加
            dmc.Directories.DataSources.Add(dconfig);
            DiagnosticMonitor.Start("DiagnosticsConnectionString", dmc);

ログの出力部は、ちょっとやっつけながら、TextBoxとButtonを配置して、ログの基点となるローカルストレージにファイルを書き込むだけです。

        protected void Button1_Click(object sender, EventArgs e)
        {
            var logfile = this.TextBox1.Text;
            var message = this.TextBox2.Text;

            if (string.IsNullOrEmpty(logfile))
                return;

            try
            {
                var ls = RoleEnvironment.GetLocalResource("ls");
                logfile = Path.Combine(ls.RootPath, logfile);
                using (var sw = new StreamWriter(logfile, true))
                {
                    sw.WriteLine("{0} : {1}", DateTime.UtcNow, message);
                }
            }
            catch (Exception ex)
            {
                this.Label1.Text = ex.ToString();
            }
        }
    }

出力されたログをVisual Studioで覗いたところ。上は、開発ファブリックから書き込んだもの。下が、WebRoleから書き込んだもの。

出力してみると、ちゃんと値が入っています。

10/6/2010 12:30:16 PM : message a
10/6/2010 12:30:18 PM : message b
10/6/2010 12:30:21 PM : message c