我有一個TraceSource.TraceEvent()
的調用,有時不寫入Azure診斷日誌。當Exception消息包含不可打印的字符時,TraceSource.TraceEvent()無法記錄
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
}
}
}
在某些情況下,我不能告訴因爲我不能讀取異常消息,所述第二呼叫在所述WADLogsTable找到。是否有某些字符是不允許的,通過TraceSource
或DiagnosticMonitor
?
爲了進一步縮小範圍,異常問題實際上是異常的InnerException
:「XML文檔(72,-499)中存在錯誤」。導致異常的XML包含無效的字符實體,例如
。難道是異常消息包含這些字符實體中的一部分,並且TraceSource
未能記錄它們?
編輯:我終於可以在我的開發環境中重現這一點,所以我能夠在調試器中檢查異常。不會記錄的例外是XmlException
:
'',十六進制值0x11,是一個無效字符。 72行,位置-499。
在引號之間是不可打印的字符 - 它在調試器中顯示爲黑色三角形。所以,這讓我相信我的懷疑是正確的 - 某些日誌記錄機制不喜歡不可打印的字符。那麼,哪一塊?或者更重要的是,因爲看起來我需要在跟蹤時開始清理所有的字符串,我應該找哪些字符去除?
是否有一些內置函數可以清理字符串,刪除不可打印的字符?
看起來很整齊,是的,我完全同意,這不應該發生,我懷疑你有一種方法可以替換控制字符並僅保留換行符。 –