3

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 に見つからないため、どちらが原因かわかりません。TraceSourcebyまたは byのいずれかで許可されていない特定の文字はありDiagnosticMonitorますか?

これをさらに絞り込むために、問題の例外は実際にInnerExceptionは Exception: "There is an error in XML document (72, -499)" です。例外の原因となった XML には、無効な文字エンティティが含まれています。例外メッセージにこれらの文字エンティティの一部が含まれていて、それらTraceSourceをログに記録できない可能性がありますか?

編集:最終的に開発環境でこれを再現できたので、デバッガーで例外を調べることができました。ログに記録されない例外は次のXmlExceptionとおりです。

'' (16 進値 0x11) は無効な文字です。行 72、位置 -499。

引用符の間に印刷できない文字があります - デバッガーでは黒い三角形として表示されます。したがって、これは私の疑いが正しいと信じるように導きます.ロギングメカニズムの一部は、印刷できない文字が好きではありません. では、どの作品?または、さらに重要なことは、トレースするときにすべての文字列のサニタイズを開始する必要があるように見えるため、どの文字を削除する必要があるのでしょうか?

文字列をサニタイズして、印刷できない文字を削除する組み込み関数はありますか?

4

2 に答える 2

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

私がこれをしなければならないことは私を悩ませます。診断システムの主な用途の 1 つは、例外をログに記録することです。このような診断システムは、例外メッセージに含まれる可能性のあるすべての文字列を処理できる必要があります。 改行もなくなり、イライラします。 編集:改行を失うのはRemoveControlChars(). 気が付かなかったので「操作キャラ」に含まれています\r。および文字\nを置換しないように正規表現を更新しました。\r\n

私は自分の答えを受け入れるのが好きではないので、別の解決策または私の改善策がある場合は、投稿してください。それがより良い場合は、受け入れます.

于 2011-10-04T18:01:36.243 に答える
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 に答える