2011-09-30 2 views
3

때때로 Azure 진단 로그에 쓰지 않는 TraceSource.TraceEvent()을 호출하고 있습니다. 어떤 경우에는 예외 메시지에 인쇄 할 수없는 문자가 포함되어 있으면 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?

이 범위를 더 좁히기 위해 문제의 예외는 실제로는 "XML 문서 (72, -499)에 오류가 있습니다"라는 예외의 InnerException입니다. 예외를 발생시키는 XML에 유효하지 않은 문자 엔터티가 포함되어 있습니다 (예 : ). 예외 메시지에 이러한 문자 엔티티 중 일부가 포함되어 있고 TraceSource이 로그 엔티티에 실패 할 수 있습니까?

편집 : 나는 마침내 내 dev 환경에서이 repro 수 수 있었고 그래서 디버거에서 예외를 검사 할 수 있었다. 로그에 기록되지 않는 예외는 XmlException :

''이며 16 진수 값 0x11은 잘못된 문자입니다. 라인 72, 위치 -499.

따옴표 사이에는 인쇄 할 수없는 문자가 표시되며 디버거에서 검은 색 삼각형으로 표시됩니다. 그래서, 이것은 내 의심이 옳다는 것을 알게한다. - 로깅 메커니즘의 일부는 인쇄 할 수없는 문자를 좋아하지 않는다. 그럼, 어떤 조각? 또는 더 중요한 것은, 추적 할 때 모든 문자열을 살균해야하기 때문에 어떤 문자를 제거해야합니까?

인쇄 할 수없는 문자를 제거하고 문자열을 살균하는 기능이 내장되어 있습니까?

답변

1

The answer to another question으로 해결 방법을 찾았습니다. 나는 편의를 위해 확장 방법 중 몇 가지를 추가 :

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()); 
} 

나는 int에 내가 TraceEvent를 호출하고 자연 과부하를 추가 할 때마다 MyEvtEnum 캐스팅하지 않아도의 추가 혜택을 좋아한다, 그래서 이것은 이중 승리 것 같은 느낌이 든다.

나는이 모든 것을해야한다는 것을 괴롭힌다. 진단 시스템의 주요 용도 중 하나는 예외를 기록하는 것입니다. 이러한 진단 시스템은 예외 메시지에 포함될 수있는 모든 문자열을 처리 할 수 ​​있어야합니다. 나는 또한 회선을 잃어 버려서 실망 스럽다.편집 : 줄 바꿈을 잃는 것은 RemoveControlChars()의 부작용이었습니다.나는 \r\n이 "제어 문자"로 포함되어 있다는 것을 깨닫지 못했습니다. 정규식을 업데이트하여 \r\n자를 바꿀 수 없습니다.

내 답변을 수락하는 것을 좋아하지 않으므로 대체 솔루션이나 개선 사항이있는 경우 게시하여주십시오. 더 나은 것이 있으면 받아 들일 것입니다.

+0

멋지게 보입니다. 그리고 예, 전적으로 동의합니다. 이런 일은 일어나지 않아야합니다. 제어 문자를 대체하고 linebreaks 만 남겨 둡니다. –

1

흥미 롭습니다. 예외 문자열을 HTML로 인코딩해야합니다. 따옴표가 예 : " 및 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에 대한 참조를 추가해야이 문제를 해결할 수 있습니다.

+0

감사합니다. Jeremy. 이것은 나쁜 대답은 아니지만 내가 찾고있는 것이 아닙니다. 난 단지 제어 문자를 처리하고, HTML은 반드시 내가 원하는 대상 인코딩이 아닙니다. – gilly3

+0

충분하다. 그러나 추적 소스는 < and >과 같은 인용 부호가없는 XML 엔터티를 싫어하며 "같은 방식으로? –

관련 문제