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
?
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? –
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
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