WCF 분석 추적
WCFAnalyticTracingExtensibility 샘플은 WCF(Windows Communication Foundation)가 .NET Framework의 ETW에 기록하는 분석 추적 스트림에 고유한 추적 이벤트를 추가하는 방법을 보여 줍니다. 분석 추적은 성능을 크게 저하시키지 않으면서 서비스를 쉽게 확인할 수 있도록 하기 위한 것입니다. 이 샘플에서는 System.Diagnostics.Eventing API를 사용하여 WCF 서비스와 통합되는 이벤트를 기록하는 방법을 보여 줍니다.
System.Diagnostics.Eventing API에 대한 자세한 내용은 System.Diagnostics.Eventing을 참조하세요.
Windows의 이벤트 추적에 대한 자세한 내용은 ETW를 사용한 디버깅 및 성능 조정 개선을 참조하세요.
EventProvider 삭제
이 샘플에서는 System.Diagnostics.Eventing.EventProvider을 구현하는 System.IDisposable 클래스를 사용합니다. WCF 서비스에 대한 추적을 구현할 경우 서비스의 수명 동안 EventProvider의 리소스를 사용할 수 있습니다. 이러한 이유로, 또한 읽기 쉽게 하려는 목적으로 이 샘플에서는 래핑된 EventProvider를 삭제하지 않습니다. 어떤 이유로 서비스에 다른 추적 요구 사항이 있으며 이 리소스를 삭제해야 하는 경우 관리되지 않는 리소스를 삭제하기 위한 최선의 방법에 따라 이 샘플을 수정해야 합니다. 비관리형 리소스를 삭제하는 방법에 대한 자세한 내용은 Dispose 메서드 구현을 참조하세요.
자체 호스팅과 웹 호스팅 비교
웹 호스팅 서비스의 경우 WCF의 분석 추적에서는 추적을 내보내는 서비스를 식별하는 데 사용되는 “HostReference”라는 필드를 제공합니다. 확장 가능한 사용자 추적이 이 모델에 관여할 수 있으며 이 샘플에서는 이 작업을 수행하기 위한 최선의 방법을 보여 줍니다. 파이프 문자 ‘|’가 실제로 결과 문자열에 나타나는 경우 웹 호스트 참조 형식은 다음 중 하나일 수 있습니다.
애플리케이션이 루트에 없는 경우
<SiteName><ApplicationVirtualPath>|<ServiceVirtualPath>|<ServiceName>
애플리케이션이 루트에 있는 경우
<SiteName>|<ServiceVirtualPath>|<ServiceName>
자체 호스팅 서비스의 경우 WCF의 분석 추적에서는 “HostReference” 필드를 채우지 않습니다. 이 샘플의 WCFUserEventProvider
클래스는 자체 호스팅 서비스에서 사용될 때 일관성 있게 동작합니다.
사용자 지정 이벤트 상세 정보
WCF의 ETW 이벤트 공급자 매니페스트는 WCF 서비스 작성자가 서비스 코드 내에서 내보내도록 디자인한 세 개의 이벤트를 정의합니다. 다음 표에서는 세 개의 이벤트를 간략하게 설명합니다.
이벤트 | 설명 | 이벤트 ID |
---|---|---|
UserDefinedInformationEventOccurred | 문제는 아니지만 중요한 사항이 서비스에 발생하면 이 이벤트를 내보냅니다. 예를 들어 데이터베이스를 성공적으로 호출한 후 이벤트를 내보낼 수 있습니다. | 301 |
UserDefinedWarningOccurred | 이후에 오류를 초래할 수 있는 문제가 발생하면 이 이벤트를 내보냅니다. 예를 들어 데이터베이스에 대한 호출에 실패했지만 중복 데이터 저장소를 대신 사용하여 복구할 수 있는 경우 경고 이벤트를 내보낼 수 있습니다. | 302 |
UserDefinedErrorOccurred | 서비스가 예상한 대로 동작하지 않으면 이 이벤트를 내보냅니다. 예를 들어 데이터베이스에 대한 호출에 실패하고 다른 위치에서 데이터를 검색할 수 없는 경우 이벤트를 내보낼 수 있습니다. | 303 |
이 샘플을 사용하려면
Visual Studio를 사용하여 WCFAnalyticTracingExtensibility.sln 솔루션 파일을 엽니다.
솔루션을 빌드하려면 Ctrl+Shift+B를 누릅니다.
Ctrl+F5를 눌러 솔루션을 실행합니다.
웹 브라우저에서 Calculator.svc를 클릭합니다. 서비스의 WSDL 문서에 대한 URI가 브라우저에 나타납니다. 이 URI를 복사합니다.
WCF 테스트 클라이언트(WcfTestClient.exe)를 실행합니다.
WCF 테스트 클라이언트(WcfTestClient.exe)는
\<Visual Studio Install Dir>\Common7\IDE\WcfTestClient.exe
에 있습니다.WCF 테스트 클라이언트 내에서 파일을 선택한 다음, 서비스 추가를 선택하여 서비스를 추가합니다.
입력 상자에 엔드포인트 주소를 추가합니다.
확인 을 클릭하여 대화 상자를 닫습니다.
ICalculator 서비스가 내 서비스 프로젝트 아래의 왼쪽 패널에 추가됩니다.
이벤트 뷰어 애플리케이션을 엽니다.
서비스를 호출하기 전에 이벤트 뷰어를 시작하고 이벤트 로그가 WCF 서비스에서 내보낸 추적 이벤트를 수신 대기하고 있는지 확인합니다.
시작 메뉴에서 관리 도구를 선택한 다음, 이벤트 뷰어를 선택합니다. 분석 및 디버그 로그를 사용하도록 설정합니다.
이벤트 뷰어의 트리 뷰에서 이벤트 뷰어, 애플리케이션 및 서비스 로그, Microsoft, Windows, 애플리케이션 서버-애플리케이션으로 이동합니다. 애플리케이션 서버-애플리케이션을 마우스 오른쪽 단추로 클릭하고 보기, 분석 및 디버그 로그 표시를 차례로 선택합니다.
분석 및 디버그 로그 표시 옵션이 선택되어 있는지 확인합니다. 분석 로그를 사용하도록 설정합니다.
이벤트 뷰어의 트리 뷰에서 이벤트 뷰어, 애플리케이션 및 서비스 로그, Microsoft, Windows, 애플리케이션 서버-애플리케이션, 분석으로 이동합니다. 분석을 마우스 오른쪽 단추로 클릭하고 로그 사용을 선택합니다.
WCF 테스트 클라이언트를 사용하여 서비스를 테스트합니다.
WCF 테스트 클라이언트의 ICalculator 서비스 노드에서 Add()를 두 번 클릭합니다.
오른쪽 창에 두 개의 매개 변수와 함께 Add() 메서드가 나타납니다.
첫 번째 매개 변수에 2를 입력하고 두 번째 매개 변수에 3을 입력합니다.
호출을 클릭하여 메서드를 호출합니다.
이미 열어 놓은 이벤트 뷰어 창으로 이동합니다. 이벤트 뷰어, 애플리케이션 및 서비스 로그, Microsoft, Windows, 애플리케이션 서버-애플리케이션으로 이동합니다.
분석 노드를 마우스 오른쪽 단추로 클릭한 다음, 새로 고침을 선택합니다.
오른쪽 창에 이벤트가 나타납니다.
ID가 303인 이벤트를 찾아서 두 번 클릭하여 열고 해당 내용을 검사합니다.
이 이벤트는 ICalculator 서비스의
Add()
메서드에서 내보낸 것으로, 페이로드는 “2+3=5”입니다.
정리하려면(옵션)
이벤트 뷰어를 엽니다.
이벤트 뷰어, 애플리케이션 및 서비스 로그, Microsoft, Windows, 애플리케이션 서버-애플리케이션으로 이동합니다. 분석을 마우스 오른쪽 단추로 클릭하고 로그 사용 안 함을 선택합니다.
이벤트 뷰어, 애플리케이션 및 서비스 로그, Microsoft, Windows, 애플리케이션 서버-애플리케이션, 분석으로 이동합니다. 분석을 마우스 오른쪽 단추로 클릭하고 로그 지우기를 선택합니다.
지우기를 클릭하여 이벤트를 지웁니다.
알려진 이슈
ETW 이벤트가 디코딩되지 않을 수 있으며, 이는 이벤트 뷰어와 관련하여 알려진 문제입니다. “Microsoft-Windows-Application Server-Applications 소스에서 이벤트 ID <id>에 대한 설명을 찾을 수 없습니다. 이 이벤트를 발생시킨 구성 요소가 로컬 컴퓨터에 설치되어 있지 않거나 설치가 손상되었습니다. 로컬 컴퓨터에서 구성 요소를 설치 또는 복구할 수 있습니다.”라는 오류 메시지가 나타날 수 있습니다. 이 오류가 발생하면 작업 메뉴에서 새로 고침을 선택합니다. 그러면 이벤트가 올바르게 디코딩됩니다.