Почему диагностика Windows Azure не ведет надежный журнал? - PullRequest
5 голосов
/ 23 сентября 2011

У нас возникли проблемы с надежным ведением журнала диагностики 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();
    }
}

Обратите внимание, что наш метод AzureStorageObject.Initialize заменяетстандартный CloudStorageAccount.SetConfigurationSettingPublisher метод.

Используя этот код без каких-либо изменений кода или конфигурации, мы можем запускать его снова и снова в эмуляторе или развертывать его снова и снова в Azure с одинаково ненадежнымРезультаты.Обратите внимание, что ПРЕДПОЛАГАЕТСЯ, чтобы это произошло: 1) настроить WAD 2) спать 10 секунд, чтобы дать ему время закончить (я действительно цеплялся за соломинку, когда я добавил это) 3) записать, что WAD init завершен 4) мы записали, что Run()вызывается и затем мы делаем всю нашу работу (WorkerAgent имеет наш цикл while(true)).Иногда так бывает.Иногда мы не получаем зарегистрированное сообщение в 3), но мы получаем его в 4).Иногда мы не получаем это в 3 или 4).Опять же, НИЧЕГО не изменяется в коде или конфигурации, и все это указывает на хранилище Azure (не на хранилище эмулятора).

Почему эта надежная запись в журнал не выполняется каждый раз, когда мы вызываем Trace.Write?

1 Ответ

2 голосов
/ 02 октября 2011

Этот вопрос

TraceSource.TraceEvent () не может войти в систему, когда сообщение об исключении содержит непечатаемые символы

сообщает о проблеме, когда при автоматическом ведении журнала происходит сбой в результатеисключение выдается при регистрации.В частности, в этом случае сообщение журнала не может быть сериализовано.

Исправление для этой ситуации заключается в использовании HttpUtility.HtmlEncode для кодирования текста исключения до его входа в Azure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...