2

何か問題が発生した場合、worker ロールの操作は少しトリッキーです。ワーカー ロールで例外が発生し、ロールが終了して再起動されます。

何が起こっているのかを記録するために、紺碧の診断ソリューションを実装することにしました。トレースするメッセージを書き込もうとすると機能しますが、例外をキャッチしてログに記録できません。コードを try catch で囲み、例外の内容をトレースに書き込もうとします。

これは正しいアプローチですか?そして、なぜそれが機能しないのですか?worker ロールで例外をログに記録するより良い方法はありますか? ありがとうございました。私のコードは次のとおりです。

public class WorkerRole : RoleEntryPoint
    {

    private const int WAIT_INTERVAL_SECONDS = 15;

    public override void Run()
    {
        Trace.WriteLine("$projectname$ entry point called", "Information");

        while (true)
        {

            try
            {
                string id = MainWCFRole.Storage.TrackProcessingQueueDAO.retrieveMsgContents();
                if ((id != null) && (!id.Equals("")))
                {
                    var points = MainWCFRole.Storage.TrackRawDataDAO.retrieve(id);

                    Processor.process(id, points);
                }
                else
                {
                    Thread.Sleep(WAIT_INTERVAL_SECONDS * 1000);
                }
            }
            catch (Exception ex)
            {
                Trace.TraceInformation("Something went wrong");
                Trace.TraceError(ex.ToString());
                throw ex;
            }


        }
    }

    public override bool OnStart()
    {
        // Set the maximum number of concurrent connections 
        ServicePointManager.DefaultConnectionLimit = 12;

        DiagnosticMonitorConfiguration dmc = DiagnosticMonitor.GetDefaultInitialConfiguration();
        dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
        dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
        dmc.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
        dmc.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);


        DiagnosticMonitor.Start("StorageConnectionString", dmc);

        Trace.TraceInformation("Starting Worker Role TrackProcessor");

        return base.OnStart();
    }

}

Processor.process(id, points) は例外をスローするメソッドです。より正確には、SQL azure クエリを呼び出そうとしたときです。ロールが開始されると、Trace.TraceInformation("Starting Worker Role TrackProcessor"); が呼び出されるため、診断が機能することはわかっています。テーブルストレージにメッセージとして表示されます。その後、ロールで例外が発生し、再起動が強制されるため、時間の経過とともにさらに多くのメッセージが発生します。ただし、ログにエラー メッセージはありません。

4

2 に答える 2

3

Run()メソッドが終了すると、ワーカーはリサイクルされます。ワーカーは、ログがリサイクルされる前に、ログをストレージに転送する時間がない場合があります。

最も簡単な解決策は、例外をキャッチした後に例外を再スローしないことです。その後、手動でシャットダウンされるまで、ワーカーロールは実行を継続します。

于 2012-04-24T18:20:16.033 に答える
0

ワーカーロールのトレースリスナーを接続しましたか?ご覧ください:http: //blogs.msdn.com/b/jimoneil/archive/2010/10/08/azure-home-part-8-worker-role-and-azure-diagnostics.aspx

ワーカーロールapp.config。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <trace>
            <listeners>
                <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener,                            Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0,                            Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                    name="AzureDiagnostics">
                    <filter type="" />
                </add>
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>
于 2012-04-24T18:17:41.953 に答える