Windows Azure Storage SDK で Web ジョブを使用しています。新しいアイテムがキューに表示されると、クラスのメソッドが呼び出されます。SDK docsによると、メソッドのパラメーターとして TextWriter を使用すると、SDK は、Webjob のログ インフラストラクチャに表示される、書き込み可能な TextWriter を提供します。これにより、問題の診断とトラブルシューティングが非常に簡単になります。
public async static void ProcessQueueMessage([QueueTrigger("queueName")]MyModelType model, TextWriter logger)
{
await logger.WriteLineAsync(string.Format("Processing Item {0}", model.SasUrl));
// Some work here
await logger.WriteLineAsync(string.Format("Done Processing Item {0}", model.SasUrl));
}
ただし、非常に頻繁に、私のメソッドの本体内で TextWriter が破棄されています。2 番目の logger.WriteLineAsync で次の例外が発生します。
System.ObjectDisposedException was unhandled by user code
HResult=-2146232798
Message=Cannot write to a closed TextWriter.
Source=mscorlib
ObjectName=""
StackTrace:
at System.IO.__Error.WriterClosed()
at System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.WriteLine(String value)
at System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
at System.IO.TextWriter.SyncTextWriter.WriteLineAsync(String value)
at NameOfProject.Program.<ProcessQueueMessage>d__8.MoveNext() in c:\Dev\Path\To\Program.cs:line 173
InnerException:
この問題を抱えている人を他に見つけることができないため、SDK または webjobs インフラストラクチャにバグがあるとは考えられません。
呼び出しの前にロガーが破棄されたかどうかを確認する方法はありますか?
WebJobs ログ サブシステムと UI に参加するメソッド内に新しいロガーを作成する方法はありますか?