2011-09-22 6 views
5

Chúng tôi đang gặp sự cố khi Windows Azure Diagnostics đăng nhập đáng tin cậy. Nó có vẻ như bị bỏ lỡ và chúng tôi không hiểu tại sao.Tại sao Windows Azure Diagnostics không ghi nhật ký đáng tin cậy?

Dưới đây là mã của chúng tôi mà đôi khi làm việc, đôi khi không:

public class WorkerRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     Trace.WriteLine("Run() beginning.", LogLevel.Information.ToString()); 

     try 
     { 
      var logic = new WorkerAgent(); 
      logic.Go(false); 
     } 
     catch (Exception err) 
     { 
      Trace.WriteLine(err.ToString(), LogLevel.Critical.ToString()); 

      Run(); 
     } 
    } 

    public override bool OnStart() 
    { 
     // Initialize our Cloud Storage Configuration. 
     AzureStorageObject.Initialize(AzureConfigurationLocation.AzureProjectConfiguration); 

     // Initialize Azure Diagnostics 

     try 
     { 
      //get the storage account using the default Diag connection string 
      var cs = CloudStorageAccount.FromConfigurationSetting("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"); 

      //get the diag manager 
      var dm = cs.CreateRoleInstanceDiagnosticManager(RoleEnvironment.DeploymentId, 
                  RoleEnvironment.CurrentRoleInstance.Role.Name, 
                  RoleEnvironment.CurrentRoleInstance.Id); 

      //get the current configuration but if that failed, get the values from config file 
      var dc = dm.GetCurrentConfiguration() ?? DiagnosticMonitor.GetDefaultInitialConfiguration(); 

      //Windows Azure Logs 
      dc.Logs.BufferQuotaInMB = 25; 
      dc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose; 
      dc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); 

      //Windows Event Logs 
      dc.WindowsEventLog.BufferQuotaInMB = 25; 
      dc.WindowsEventLog.DataSources.Add("System!*"); 
      dc.WindowsEventLog.DataSources.Add("Application!*"); 
      dc.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); 

      ////Performance Counters 
      //dc.PerformanceCounters.BufferQuotaInMB = 25; 
      //var perfConfig = new PerformanceCounterConfiguration 
      //      { 
      //       CounterSpecifier = @"\Processor(_Total)\% Processor Time", 
      //       SampleRate = TimeSpan.FromSeconds(60) 
      //      }; 
      //dc.PerformanceCounters.DataSources.Add(perfConfig); 
      //dc.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); 

      //Failed Request Logs 
      dc.Directories.BufferQuotaInMB = 25; 
      dc.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); 

      ////Infrastructure Logs 
      //dc.DiagnosticInfrastructureLogs.BufferQuotaInMB = 25; 
      //dc.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Verbose; 
      //dc.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); 

      //Crash Dumps 
      CrashDumps.EnableCollection(true); 

      //overall quota; must be larger than the sum of all items 
      dc.OverallQuotaInMB = 5000; 

      //save the configuration 
      dm.SetCurrentConfiguration(dc); 
     } 
     catch (Exception ex) 
     { 
      Trace.Write(ex.Message, LogLevel.Critical.ToString()); 
     } 

     // give logging time to register itself and load up. 
     Thread.Sleep(10000); 

     Trace.WriteLine("Completed diagnostics initialization.", LogLevel.Information.ToString()); 

     return base.OnStart(); 
    } 
} 

Lưu ý rằng phương pháp AzureStorageObject.Initialize của chúng tôi thay thế các tiêu chuẩn CloudStorageAccount.SetConfigurationSettingPublisher phương pháp.

Sử dụng mã này hoàn toàn không có thay đổi mã hoặc thay đổi cấu hình, chúng tôi có thể chạy nó lặp đi lặp lại trong trình mô phỏng hoặc triển khai nó qua và hơn và đến Azure với kết quả không đáng tin cậy như nhau. Lưu ý rằng những gì là SUPPOSED xảy ra là 1) thiết lập WAD 2) ngủ 10 giây để cho nó thời gian để kết thúc (tôi đã thực sự nắm bắt cho ống hút khi tôi thêm này) 3) đăng nhập mà init WAD được thực hiện 4) chúng tôi đăng nhập Run() được gọi là và sau đó chúng tôi thực hiện tất cả công việc của mình (WorkerAgent có vòng lặp while(true) trong đó). Đôi khi đây là những gì xảy ra. Đôi khi, chúng tôi không nhận được thông báo đã đăng nhập trong 3) nhưng chúng tôi nhận được nó trong 4). Đôi khi chúng tôi không nhận được nó trong 3 hoặc 4). Một lần nữa, NOTHING thay đổi mã hoặc cấu hình và tất cả điều này trỏ đến lưu trữ Azure (không phải bộ lưu trữ giả lập).

Tại sao nhật ký này không đáng tin cậy mỗi lần chúng tôi gọi Trace.Write?

+0

Mất thời gian để các công cụ chẩn đoán xoay quanh việc sao chép nhật ký của bạn vào bộ nhớ. Vai trò của bạn có kéo dài hơn 15 phút không? –

+1

Vâng. Nhìn vào cấu hình - Tôi có nó thiết lập để sao chép chúng mỗi 1 phút. Các mục trong tương lai được ghi lại thành công, đó là những mục ban đầu được đăng ngẫu nhiên khi tôi khởi động cá thể. Và như được chứng minh bằng 'Thread.Sleep (10000)', tôi không chắc chắn yếu tố quyết định là gì khi nó bắt đầu đăng nhập thành công. Đôi khi nó ngay lập tức và ghi lại thông điệp đầu tiên mà không có giấc ngủ, và đôi khi ngay cả với giấc ngủ nó không đăng nhập bất kỳ tin nhắn nào trong một thời gian (tôi không biết "một thời gian" là gì, hoặc tại sao phải mất một thời gian "). – Jaxidian

+1

thật không may, tôi tự hỏi điều tương tự, vì vậy tôi đã bỏ phiếu cho câu hỏi của bạn. tôi cuối cùng đã viết logger lưu trữ bảng của riêng tôi ... và đôi khi nó không thành công do trục trặc lưu trữ http. – CedricB

Trả lời

2

Câu hỏi này

TraceSource.TraceEvent() fails logging when Exception message contains non-printable characters

báo cáo một vấn đề khi đăng nhập âm thầm thất bại như một hệ quả của một ngoại lệ được ném trong khi đăng nhập. Cụ thể trong trường hợp này, thông điệp tường trình không thể được tuần tự hóa.

Khắc phục tình huống này là sử dụng HttpUtility.HtmlEncode để mã hóa văn bản ngoại lệ trước khi đăng nhập Azure.

+0

Đây là một mẹo rất hay và thú vị, nhưng đây không phải là trường hợp của chúng tôi. Tôi đã thêm ngẫu nhiên 'Trace.WriteLine (" Hello World "),' (đi theo bộ nhớ, cú pháp có thể sai) dòng và họ đều thất bại. Nhưng như tôi đã nói, tôi thực sự đánh giá cao việc bạn chú ý đến điều này. Tôi chắc chắn điều này đã hoặc sẽ là một vấn đề mà chúng tôi không biết! – Jaxidian

+2

Thành thật mà nói tôi nghĩ rằng đây là một lỗi trong doodads đăng nhập Azure - nó nên làm mã hóa HTML thay mặt chúng tôi. (Paging @smarx ...) –