Jax*_*ian 5 azure azure-diagnostics
我们在使Windows Azure诊断程序可靠地记录时遇到问题.它似乎有点不可思议,我们不明白为什么.
这是我们的代码,有时可以工作,有时不会:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们的AzureStorageObject.Initialize方法取代了标准CloudStorageAccount.SetConfigurationSettingPublisher方法.
使用此代码绝对没有代码更改或配置更改,我们可以在模拟器中反复运行它,或者将其一遍又一遍地部署到Azure,同样具有同样不可靠的结果.请注意,支持发生的事情是1)设置WAD 2)睡10秒钟给它时间完成(当我添加它时我真的抓住了吸管)3)记录WAD初始化完成4)我们记录Run()被调用的然后我们去做我们所有的工作(WorkerAgent我们的while(true)循环).有时这就是发生的事情.有时,我们没有在3)中获取记录的消息,但我们确实在4)中得到了它.有时我们不会在3或4中得到它.同样,代码或配置中的NOTHING更改,所有这些都指向Azure存储(而不是模拟器存储).
为什么每次打电话都不能可靠地记录Trace.Write?
这个问题
当异常消息包含不可打印字符时,TraceSource.TraceEvent() 无法记录
由于日志记录时引发异常而导致静默日志记录失败时,会报告问题。特别是在这种情况下,日志消息无法序列化。
解决这种情况的方法是HttpUtility.HtmlEncode在登录到 Azure 之前对异常文本进行编码。
| 归档时间: |
|
| 查看次数: |
1195 次 |
| 最近记录: |