5

Windows Azure Diagnostics で確実にログを記録する際に問題が発生しています。当たり外れがあるように見えますが、その理由はわかりません。

以下は、動作する場合と動作しない場合があるコードです。

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ですか?

4

1 に答える 1

2

この質問

例外メッセージに印刷できない文字が含まれている場合、TraceSource.TraceEvent()はロギングに失敗します

ロギング中に例外がスローされた結果として、ロギングがサイレントに失敗した場合の問題を報告します。特にこの場合、ログメッセージをシリアル化することはできません。

この状況の修正はHttpUtility.HtmlEncode、Azureにログインする前に例外テキストをエンコードするために使用することです。

于 2011-10-02T08:28:19.490 に答える