3

我有一个电话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 中找不到第二个调用。是否有某些字符不允许使用 byTraceSource或 by DiagnosticMonitor

为了进一步缩小范围,有问题的异常实际上是InnerException异常:“XML 文档中存在错误(72,-499)”。导致异常的 XML 包含无效字符实体,例如. 异常消息是否包含其中一些字符实体并且TraceSource无法记录它们?

编辑:我终于能够在我的开发环境中重现这个,所以我能够在调试器中检查异常。不会记录的异常是XmlException

'',十六进制值 0x11,是无效字符。第 72 行,位置 -499。

引号之间是不可打印的字符 - 它在调试器中显示为黑色三角形。所以,这让我相信我的怀疑是正确的——日志机制的某些部分不喜欢不可打印的字符。那么,哪一块?或者,更重要的是,因为看起来我需要在跟踪时开始清理我的所有字符串,我应该寻找哪些字符来删除?

是否有一些内置函数可以清理字符串,删除不可打印的字符?

4

2 回答 2

1

有趣的。看起来您需要对异常字符串进行 HTML 编码。这会将引号转换为 eg"并将您的 ASCII 非打印字符转换为或类似字符。

所以:

    trace.TraceEvent(TraceEventType.Error, 0,
        "ex has message: " + HttpUtility.HtmlEncode(hasMsg.ToString()));   
    trace.TraceEvent(TraceEventType.Error, 0,
        "Inner exception message: " + HttpUtility.HtmlEncode(ex.Message)); 

应该可以正常工作。

令人沮丧的HttpUtility是,在 System.Web 中,您需要添加对 System.Web.dll 的引用才能执行此操作。

于 2011-10-02T06:49:50.643 回答
1

另一个问题的答案帮助我找到了解决方案。为方便起见,我添加了几个扩展方法:

public static string RemoveControlChars(this string s)
{
    return Regex.Replace(s, @"(?![\r\n])\p{Cc}", "");
}
public static void TraceEvent(this TraceSource trace, 
    TraceEventType eventType, MyEvtEnum eventId, string message)
{
    trace.TraceEvent(eventType, (int)eventId, message.RemoveControlChars());
}

我喜欢不必每次跟MyEvtEnum注时都施法的额外好处,它增加了自然的过载,所以这感觉像是双赢。intTraceEvent

我不得不这样做,这让我很困扰。诊断系统的主要用途之一是记录异常。这样的诊断系统应该能够处理异常消息可能包含的任何字符串。 我也失去了换行符,这令人沮丧。 编辑:丢失换行符是RemoveControlChars(). 我没有意识到这一点,\r并被\n列为“控制字符”。我已将正则表达式更新为不替换\r\n字符。

我不喜欢接受我自己的答案,所以如果您有替代解决方案或对我的改进,请发布它,如果更好,我会接受。

于 2011-10-04T18:01:36.243 回答