TraceSource.TraceEvent()
Azure Diagnostics ログに書き込まれないことがあります。
public class WorkerRole : RoleEntryPoint
{
private TraceSource trace = new TraceSource(
"ImportService", SourceLevels.Information);
public override void Run()
{
...
try
{
...
}
catch (Exception ex)
{
bool hasMsg = !string.IsNullOrEmpty(ex.Message);
trace.TraceEvent(TraceEventType.Error, 0,
"ex has message: " + hasMsg.ToString()); // this gets logged
trace.TraceEvent(TraceEventType.Error, 0,
"Inner exception message: " + ex.Message); // this does not
}
}
}
場合によっては、例外メッセージを読み取ることができないため、2 番目の呼び出しが WADLogsTable に見つからないため、どちらが原因かわかりません。TraceSource
byまたは byのいずれかで許可されていない特定の文字はありDiagnosticMonitor
ますか?
これをさらに絞り込むために、問題の例外は実際にInnerException
は Exception: "There is an error in XML document (72, -499)" です。例外の原因となった XML には、無効な文字エンティティが含まれています
。例外メッセージにこれらの文字エンティティの一部が含まれていて、それらTraceSource
をログに記録できない可能性がありますか?
編集:最終的に開発環境でこれを再現できたので、デバッガーで例外を調べることができました。ログに記録されない例外は次のXmlException
とおりです。
'' (16 進値 0x11) は無効な文字です。行 72、位置 -499。
引用符の間に印刷できない文字があります - デバッガーでは黒い三角形として表示されます。したがって、これは私の疑いが正しいと信じるように導きます.ロギングメカニズムの一部は、印刷できない文字が好きではありません. では、どの作品?または、さらに重要なことは、トレースするときにすべての文字列のサニタイズを開始する必要があるように見えるため、どの文字を削除する必要があるのでしょうか?
文字列をサニタイズして、印刷できない文字を削除する組み込み関数はありますか?