EventSource 추적 수집 및 보기
이 문서의 적용 대상: ✔️ .NET Core 3.1 이상 버전 ✔️ .NET Framework 4.5 이상 버전
시작 가이드에서는 최소한의 EventSource를 만들고 추적 파일에서 이벤트를 수집하는 방법을 보여주었습니다. 이 자습서에서는 다양한 도구가 추적에서 수집되는 이벤트를 구성한 다음 추적을 보는 방법을 보여 줍니다.
예제 앱
이 자습서에 대한 이벤트를 생성하는 다음 샘플 앱을 사용합니다. 다음 코드를 포함하는 .NET 콘솔 애플리케이션을 컴파일합니다.
using System.Diagnostics.Tracing;
namespace EventSourceDemo
{
public static class Program
{
public static void Main(string[] args)
{
DemoEventSource.Log.AppStarted("Hello World!", 12);
DemoEventSource.Log.DebugMessage("Got here");
DemoEventSource.Log.DebugMessage("finishing startup");
DemoEventSource.Log.RequestStart(3);
DemoEventSource.Log.RequestStop(3);
}
}
[EventSource(Name = "Demo")]
class DemoEventSource : EventSource
{
public static DemoEventSource Log { get; } = new DemoEventSource();
[Event(1, Keywords = Keywords.Startup)]
public void AppStarted(string message, int favoriteNumber) => WriteEvent(1, message, favoriteNumber);
[Event(2, Keywords = Keywords.Requests)]
public void RequestStart(int requestId) => WriteEvent(2, requestId);
[Event(3, Keywords = Keywords.Requests)]
public void RequestStop(int requestId) => WriteEvent(3, requestId);
[Event(4, Keywords = Keywords.Startup, Level = EventLevel.Verbose)]
public void DebugMessage(string message) => WriteEvent(4, message);
public class Keywords
{
public const EventKeywords Startup = (EventKeywords)0x0001;
public const EventKeywords Requests = (EventKeywords)0x0002;
}
}
}
수집할 이벤트 구성
대부분의 이벤트 컬렉션 도구는 다음 구성 옵션을 사용하여 추적에 포함할 이벤트를 결정합니다.
- 공급자 이름 - 하나 이상의 EventSource 이름 목록입니다. 이 목록의 EventSources에 정의된 이벤트만 포함할 수 있습니다. 이전 예제 앱의 DemoEventSource 클래스에서 이벤트를 수집하려면 공급자 이름 목록에 EventSource 이름 "Demo"를 포함해야 합니다.
- 이벤트 세부 정보 표시 수준 - 각 공급자에 대해 세부 정보 표시 수준을 정의할 수 있으며 해당 수준보다 높은 세부 정보 표시가 있는 이벤트는 추적에서 제외됩니다. 앞의 예제 앱에서 "Demo" 공급자가 정보 세부 정보 표시 수준에서 수집해야 하도록 지정한 경우 DebugMessage 이벤트는 더 높은 수준을 가지므로 제외됩니다. EventLevel LogAlways(0)를 지정하는 것은 세부 정보 표시 수준의 이벤트를 포함해야 함을 나타내는 특수한 경우입니다.
- 이벤트 키워드 - 각 공급자에 대해 키워드 집합을 정의할 수 있으며 하나 이상의 키워드로 태그가 지정된 이벤트만 포함됩니다. 위의 예제 앱에서 Startup 키워드를 지정한 경우 AppStarted 및 DebugMessage 이벤트만 포함됩니다. 키워드가 지정되지 않은 경우 이는 특수한 경우이며 키워드가 있는 이벤트를 포함해야 함을 의미합니다.
공급자 구성을 설명하기 위한 규칙
각 도구는 추적 구성을 설정하기 위한 자체 사용자 인터페이스를 결정하지만, 많은 도구가 구성을 텍스트 문자열로 지정할 때 사용하는 일반적인 규칙이 있습니다. 공급자 목록은 세미콜론으로 구분된 목록으로 지정되며 목록의 각 공급자 요소는 이름, 키워드 및 콜론으로 구분된 수준으로 구성됩니다. 예를 들어 "Demo:3:5"는 키워드 비트 마스크 3(Startup
비트 및 Requests
비트)과 EventLevel 5(Verbose
)를 사용하여 "Demo"라는 EventSource를 식별합니다. 수준이나 키워드 필터링을 원하지 않는 경우 많은 도구를 사용하여 수준과 키워드를 생략할 수도 있습니다. 예를 들어 "Demo::5"는 수준 기반 필터링만 하고, "Demo:3"은 키워드 기반 필터링만 하고, "Demo"는 키워드 또는 수준 필터링을 수행하지 않습니다.
Visual Studio
Visual Studio 프로파일러는 추적 수집 및 보기를 모두 지원합니다. 또한 dotnet-trace와 같은 다른 도구에서 미리 수집된 추적을 볼 수 있습니다.
추적 수집
대부분의 Visual Studio 프로파일링 도구는 CPU 사용량 또는 할당 분석과 같은 특정 용도로 제공되는 미리 정의된 이벤트 집합을 사용합니다. 사용자 지정된 이벤트를 사용하여 추적을 수집하려면 이벤트 뷰어 도구를 사용합니다.
Visual Studio에서 성능 프로파일러를 열려면 Alt+F2를 선택합니다.
이벤트 뷰어 확인란을 선택합니다.
이벤트 뷰어 오른쪽에 있는 작은 기어 아이콘을 선택하여 구성 창을 엽니다.
아래 추가 공급자 표에서 사용 확인란을 클릭한 다음 공급자 이름, 키워드 및 수준을 입력하여 구성하려는 각 공급자에 대한 행을 추가합니다. 공급자 GUID를 입력할 필요가 없습니다. 자동으로 계산됩니다.
확인을 선택하여 구성 설정을 확인합니다.
시작을 선택하여 앱 실행 및 로그 수집을 시작합니다.
수집 중지를 선택하거나 앱을 종료하여 로그 수집을 중지하고 수집된 데이터를 표시합니다.
추적 보기
Visual Studio는 자체 수집한 추적을 보거나 다른 도구에서 수집된 추적을 볼 수 있습니다. 다른 도구에서 추적을 보려면 파일>열기를 사용하여 파일 선택기에서 추적 파일을 선택합니다. Visual Studio 프로파일러에서는 .etl 파일(ETW의 표준 형식), .nettrace 파일(EventPipe의 표준 형식) 및 .diagsession 파일(Visual Studio의 표준 형식)을 지원합니다. Visual Studio에서 추적 파일 작업에 대한 자세한 내용은 Visual Studio 설명서를 참조하세요.
참고 항목
Visual Studio는 명시적으로 구성되지 않은 경우에도 ETW 또는 EventPipe에서 일부 이벤트를 자동으로 수집합니다. 공급자 이름 또는 이벤트 이름 열에 인식할 수 없는 이벤트가 표시되고 필터링하려는 경우 오른쪽의 필터 아이콘을 사용하여 보려는 이벤트만 선택합니다.
PerfView
PerfView는 ETW 추적을 수집하고 볼 수 있는 .NET 팀에서 만든 성능 도구입니다. 다른 도구에서 수집한 추적 파일을 다양한 형식으로 볼 수도 있습니다. 이 자습서에서는 데모 앱 의 ETW 추적을 수집한 다음 PerfView의 이벤트 뷰어에서 수집된 이벤트를 검사합니다.
추적 수집
릴리스 페이지에서 PerfView를 다운로드합니다. 이 자습서는 PerfView 버전 2.0.76으로 수행되었지만 최신 버전이면 모두 작동합니다.
관리자 권한으로 PerfView.exe를 시작합니다.
참고 항목
ETW 추적 컬렉션에는 항상 관리자 권한이 필요하지만 PerfView만 사용하여 기존 추적을 보는 경우 특별한 권한이 필요하지 않습니다.
수집 메뉴에서 실행을 선택합니다. 그러면 데모 앱의 경로를 입력할 새 대화 상자가 열립니다.
수집되는 이벤트를 구성하려면 대화 상자 아래쪽에서 고급 옵션을 확장합니다. 추가 공급자 텍스트 상자에 앞에서 설명한 규칙 기반 텍스트 형식을 사용하여 공급자를 입력합니다. 이 경우 키워드 비트 1(
Startup
이벤트) 및 세부 정보 표시 4(Informational
)를 의미하는 "Demo:1:4"를 입력합니다.앱을 시작하고 추적 수집을 시작하려면 명령 실행 단추를 선택합니다. 앱이 종료되면 PerfViewData.etl 추적이 현재 디렉터리에 저장됩니다.
추적 보기
왼쪽 위에 있는 주 창 드롭다운 텍스트 상자에서 추적 파일이 포함된 디렉터리를 선택합니다. 그런 다음, 아래 트리 뷰에서 추적 파일을 두 번 클릭합니다.
이벤트 뷰어를 표시하려면 추적 파일 아래의 트리 뷰에 표시되는 이벤트 항목을 두 번 클릭합니다.
추적의 모든 이벤트 유형은 왼쪽 목록에 표시됩니다. Demo\AppStarted와 같은 이벤트 유형을 두 번 클릭하여 오른쪽 테이블에 해당 형식의 모든 이벤트를 표시합니다.
자세한 정보
PerfView 사용에 대한 자세한 내용은 PerfView 비디오 자습서를 참조하세요.
dotnet-trace
dotnet-trace는 EventPipe 추적을 사용하여 .NET Core 앱에서 추적을 수집할 수 있는 플랫폼 간 명령줄 도구입니다. 추적 데이터 보기를 지원하지 않지만 수집한 추적은 PerfView 또는 Visual Studio와 같은 다른 도구에서 볼 수 있습니다. dotnet-trace는 기본 .nettrace 형식 추적을 Chromium 또는 Speedscope와 같은 다른 형식으로 변환하는 것도 지원합니다.
추적 수집
dotnet-trace를 다운로드 및 설치합니다.
명령줄에서 dotnet-trace collect 명령을 실행합니다.
E:\temp\EventSourceDemo\bin\Debug\net6.0>dotnet-trace collect --providers Demo:1:4 -- EventSourceDemo.exe
다음과 유사한 출력이 표시됩니다.
E:\temp\EventSourceDemo\bin\Debug\net6.0> dotnet-trace collect --providers Demo:1:4 -- EventSourceDemo.exe Provider Name Keywords Level Enabled By Demo 0x0000000000000001 Informational(4) --providers Launching: EventSourceDemo.exe Process : E:\temp\EventSourceDemo\bin\Debug\net6.0\EventSourceDemo.exe Output File : E:\temp\EventSourceDemo\bin\Debug\net6.0\EventSourceDemo.exe_20220317_021512.nettrace [00:00:00:00] Recording trace 0.00 (B) Press <Enter> or <Ctrl+C> to exit... Trace completed.
dotnet-trace는
--providers
인수에서 공급자 구성을 설명하는 데 규칙 기반 텍스트 형식을 사용합니다. dotnet-trace를 사용하여 추적을 수행하는 방법에 대한 자세한 옵션은 dotnet -trace 문서를 참조하세요.
EventListener
System.Diagnostics.Tracing.EventListener(은)는 System.Diagnostics.Tracing.EventSource에서 생성된 이벤트에 대한 콜백을 수신하기 위해 In Process에서 사용할 수 있는 .NET API입니다. 이 API는 사용자 지정 로깅 도구를 만들거나 이벤트를 직렬화하지 않고 메모리의 이벤트를 분석하는 데 사용할 수 있습니다.
EventListener
(을)를 사용하려면 EventListener
에서 파생되는 형식을 선언하고, EnableEvents(을)를 호출하여 관심 있는 EventSource에서 이벤트를 구독하고, 새 이벤트를 사용할 수 있을 때마다 호출되는 OnEventWritten(을)를 재정의합니다. 어떤 EventSource 개체가 있는지 검색하기 위해 OnEventSourceCreated(을)를 재정의하는 것이 유용한 경우가 많지만 필수는 아닙니다. 다음은 메시지가 수신될 때 콘솔에 인쇄되는 예제 EventListener
구현입니다.
이 코드를 데모 앱에 추가합니다.
class ConsoleWriterEventListener : EventListener { protected override void OnEventSourceCreated(EventSource eventSource) { if(eventSource.Name == "Demo") { EnableEvents(eventSource, EventLevel.Informational); } } protected override void OnEventWritten(EventWrittenEventArgs eventData) { Console.WriteLine(eventData.TimeStamp + " " + eventData.EventName); } }
Main
메서드를 수정하여 새 수신기의 인스턴스를 만듭니다.public static void Main(string[] args) { ConsoleWriterEventListener listener = new ConsoleWriterEventListener(); DemoEventSource.Log.AppStarted("Hello World!", 12); DemoEventSource.Log.DebugMessage("Got here"); DemoEventSource.Log.DebugMessage("finishing startup"); DemoEventSource.Log.RequestStart(3); DemoEventSource.Log.RequestStop(3); }
앱을 빌드하고 실행합니다. 이전에는 출력이 없었지만 이제는 콘솔에 이벤트를 씁니다.
3/24/2022 9:23:35 AM AppStarted 3/24/2022 9:23:35 AM RequestStart 3/24/2022 9:23:35 AM RequestStop
.NET