何か問題が発生した場合、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"); が呼び出されるため、診断が機能することはわかっています。テーブルストレージにメッセージとして表示されます。その後、ロールで例外が発生し、再起動が強制されるため、時間の経過とともにさらに多くのメッセージが発生します。ただし、ログにエラー メッセージはありません。