我有一个调用TraceSource.TraceEvent()
的方法,有时无法写入到Azure诊断日志中。
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
:
引号之间的是不可打印字符-在调试器中显示为黑色三角形。因此,这使我相信我的怀疑是正确的-某些日志记录机制不喜欢不可打印字符。那么,哪个部分?或者更重要的是,由于看起来我需要从跟踪开始对所有字符串进行消毒,我应该查找哪些字符以进行删除?'', hexadecimal value 0x11, is an invalid character. Line 72, position -499.
是否有一些内置函数可以消毒字符串,删除不可打印字符?