[Windows Azure]利用Blob建立例外處理紀錄器

  • 1040
  • 0

摘要:[Windows Azure]利用Blob建立例外處理紀錄器

這幾天研究Shared Access Signatures到有點頭痛,不過還好有點頭緒了,

先來講點輕鬆的好了,前面介紹過blob的程式撰寫,今天就來分享我在Blob上的小應用,

就是將例外處理(Exception)紀錄起來,程式碼如下:


    public class ExceptionRecorder
    {
        public static readonly string CONTAINER_NAME = "exception-recorder";
        public static readonly string LOG_PRE_NAME = "groupon_exception_";
        
        public static void WriteExceptionToBlob(string ErrorStr)
        {
            WriteExceptionToBlob(ErrorStr, CONTAINER_NAME, LOG_PRE_NAME);
        }

        public static void WriteExceptionToBlob(string ErrorStr, string logSaveContainer, string logPreBlobName)
        {
            string blobName = logPreBlobName + DateTime.Now.ToString("yyyy_MMdd") + "_" + logPreBlobName + DateTime.Now.ToString("HH") + "_log";

            var account = CloudStorageAccount.FromConfigurationSetting("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
            var client = account.CreateCloudBlobClient();

            CloudBlobContainer ExceptionContainer = client.GetContainerReference(logSaveContainer);
            ExceptionContainer.CreateIfNotExist();

            BlobContainerPermissions permissions = ExceptionContainer.GetPermissions();
            permissions.PublicAccess = BlobContainerPublicAccessType.Container;
            ExceptionContainer.SetPermissions(permissions);

            CloudBlob blob = ExceptionContainer.GetBlobReference(blobName);

            if (blob.Exists())
            {
                ErrorStr = blob.DownloadText() + "\n" + DateTime.Now.ToString("yyyy-MMdd-HHmmss") + "\n" + ErrorStr + "\n";
            }
            else
            {
                ErrorStr = "\n" + DateTime.Now.ToString("yyyy-MMdd-HHmmss") + "\n" + ErrorStr + "\n";
            }

            blob.Properties.ContentType = "text/html";
            blob.UploadText(ErrorStr);
        }
    }

這裡面剛好就有用到之前所說的,怎樣判斷Blob是否存在,因為是設計成一個小時為單位,

所以總不可能複寫可能存在的紀錄吧。

複習一下:


    public static class BlobExtensions
    {
        public static bool Exists(this CloudBlob blob)
        {
            try
            {
                blob.FetchAttributes();
                return true;
            }
            catch (StorageClientException e)
            {
                if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
                {
                    return false;
                }
                else
                {
                    throw;
                }
            }
        }
    }