2014-08-27 6 views
1

내가 ETW 메시지를 캡처하고 로그 파일에 그들을 전달 TraceEventSession를 사용하는 IIS 응용 프로그램이 덮어 쓰기 : - 그것은 잘 작동ETW 로깅 TraceEventSession 파일

TraceEventSession _etwSession = new TraceEventSession(
    "MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 }; 
_etwSession.EnableProvider(
    TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"), 
    TraceEventLevel.Always); 

을하지만, 어떤 이유로 내가 다시 시작할 때마다 시간 로그 파일을 추가하는 대신 덮어 씁니다. 내가 뭘 놓쳤는가?

미리 감사드립니다.

+0

** TraceEventSessionOptions.Attach ** 시도해 보셨습니까? – magicandre1981

+0

나는 세 가지 옵션 모두 성공하지 못했습니다. –

답변

5

면책 조항 : 나는 TraceEvent 오늘 지원하지 않습니다 EVENT_TRACE_FILE_APPEND_MODE를 사용하여 ETW 파일에 추가 할 수있는 Microsoft

당신 내부에서 TraceEvent에 기여한다. 잠재적으로 추가 할 수는 있지만 API를 노출하는 것보다 더 많은 문제점을 볼 수 있습니다.

TL - 메타 데이터가 포함 된 전체 ETW 세션은 각 파일에 기록되는 것이며, 각 세션에는 시계 해상도와 같은 다양한 옵션이있을 수 있습니다. 예를 들어 레이더 및 시계 아래에 미묘한 타임 스탬프 부정확성이 발생할 수 있습니다. 어떤 점에서 당신에게 불만을 제기하십시오.

다음은 내가 권장하는 것입니다. 나는 잠을 자지 만 IIS 인스턴스가 새로 고침 될 때 추적하는 것과 같이 파일을 회전하는 방법을 결정할 논리를 설정합니다.

var _etwSession = new TraceEventSession("MyEtwLog", @"C:\Logs\MyEtwLog." + MyTimestamp + ".etl"); 
_etwSession.EnableProvider(new Guid("MyGuid"), TraceEventLevel.Always); 

Thread.Sleep(1000 * 60); 

_etwSession.SetFileName(@"C:\Logs\MyEtwLog" + timestamp + ".etl"); 

약간의 배경 :

ETW 파일이 바이너리 소비자 데이터 (로그 메시지)이며, 다음의 모든 로그 메시지가 무료로 얻는 ETW 서브 시스템에 의해 제공되는 메타 데이터에. ThreadID, 논리적 프로세서 번호, 커널 또는 사용자 모드에서의 캠인지, 마지막으로 가장 중요한 것은 타임 스탬프 (실제로는 프로세서 주파수에 따라 달라지는 값)와 같습니다.

ETW 파일 "rundown"은 운영 체제의 상태와 비슷하다고 생각하며 세션의 시작과 끝 부분에서도 파일로 플러시됩니다.

사실 대부분의 소비자가 ETW 로그가 일종의 일반 로그와 같다고 생각 하긴하지만 일종의 종류는 아닙니다. 이들은 추적이 수행 된 시간과 밀접하게 관련되어 있습니다 (ETW는 주로 Windows 커널 팀의 성능 분석에 처음부터 사용되었습니다). 파일이 독자적으로 완전히 처리 될 수 있고 목적을 위해 매우 잘 될 수 있다는 점에서 최근의 상황이 개선되었습니다.

하지만 같은 파일에 추가하는 것이 좋은 생각이 아닌 경우가 많습니다.

아, 또 다른 큰 것. ETW 파일은 처음부터 끝까지 순차적으로 읽혀집니다. 그것은 계속 성장할 것이고 적어도 지원되는 방식으로는 중간에서 읽을 수는 없습니다 :-)

마지막으로 로그를 작성한다고 생각하기 때문에 계속 추가하지 않을 것입니다. 파일 foo.etl을 사용하면 새로운 프로세서를 구입하고이 로그 파일에 추가하면 이전 세션에서 수집 한 모든 타임 스탬프가 일부 해제됩니다.

+0

제안 사항이 정확히 구현 된 것입니다 (파일 이름에 타임 스탬프 추가). 답장을 보내 주셔서 감사합니다. –

0

나는 당신이 무엇이든 놓치지 않았다고 생각하지 않습니다. TraceEventSession으로 기존 파일에 추가 할 수있는 방법은 없습니다. TraceEventSession.Merge과 함께 다른 파일을 병합하는 것은 가능하지만 동일한 시스템에서 왔고 그 동안 다시 시작되지 않은 경우에만 정확한 결과를 얻을 수 있습니다.

TraceEventSession 외부에서 수행하려는 경우 ETW API에 EVENT_TRACE_FILE_MODE_APPEND 옵션을 추가하는 방법이 있지만 제한이 있습니다.

+0

정보 Lars 주셔서 감사합니다. 사용할 수있는 TraceEventSession 대신 C# 대안이 있는지 알고 있습니까? –

+0

죄송합니다, 대안이 없습니다. –