EventSource 시작하기
이 문서의 적용 대상: ✔️ .NET Core 3.1 이상 버전 ✔️ .NET Framework 4.5 이상 버전
이 연습에서는 새 이벤트를 System.Diagnostics.Tracing.EventSource로 로그하고, 추적 파일에서 이벤트를 수집하고, 추적을 확인하고, 기본 EventSource 개념을 이해하는 방법을 보여 줍니다.
참고 항목
EventSource와 통합되는 많은 기술은 '로깅' 및 '로그' 대신 '추적'이라는 용어를 사용합니다. 여기서 의미는 동일합니다.
이벤트 로그
EventSource의 목표는 .NET 개발자가 다음과 같은 코드를 작성하여 이벤트를 로그할 수 있도록 하는 것입니다.
DemoEventSource.Log.AppStarted("Hello World!", 12);
이 코드 줄에는 로깅 개체(DemoEventSource.Log
), 로그할 이벤트를 나타내는 메서드(AppStarted
), 강력한 형식의 이벤트 매개 변수(선택 사항, HelloWorld!
및 12
)가 있습니다. 세부 정보 표시 수준, 이벤트 ID, 메시지 템플릿 또는 호출 사이트에 있을 필요가 없는 기타 다른 항목은 없습니다. 이벤트에 대한 이러한 기타 모든 정보는 System.Diagnostics.Tracing.EventSource에서 파생된 새 클래스를 정의하여 작성됩니다.
다음은 최소한의 예제 전체입니다.
using System.Diagnostics.Tracing;
namespace EventSourceDemo
{
public static class Program
{
public static void Main(string[] args)
{
DemoEventSource.Log.AppStarted("Hello World!", 12);
}
}
[EventSource(Name = "Demo")]
class DemoEventSource : EventSource
{
public static DemoEventSource Log { get; } = new DemoEventSource();
[Event(1)]
public void AppStarted(string message, int favoriteNumber) => WriteEvent(1, message, favoriteNumber);
}
}
DemoEventSource 클래스는 로그하려는 각 이벤트 유형에 대한 메서드를 선언합니다. 이 경우 'AppStarted'라는 단일 이벤트가 AppStarted() 메서드에 의해 정의됩니다. 이벤트가 활성화된 경우 코드가 AppStarted 메서드를 호출할 때마다 다른 AppStarted 이벤트가 추적에 기록됩니다. 각 이벤트와 함께 캡처할 수 있는 데이터 중 일부는 다음과 같습니다.
- 이벤트 이름 - 로그된 이벤트의 종류를 식별하는 이름입니다. 이 경우 이벤트 이름은 메서드 이름 'AppStarted'와 동일합니다.
- 이벤트 ID - 로그된 이벤트의 종류를 식별하는 숫자 ID입니다. 이름과 비슷한 역할을 하지만 빠른 자동화된 로그 처리에 도움이 될 수 있습니다. AppStarted 이벤트의 ID는 1이며 EventAttribute에 지정되어 있습니다.
- 원본 이름 - 이벤트를 포함하는 EventSource의 이름입니다. 이벤트의 네임스페이스로 사용됩니다. 이벤트 이름 및 ID는 원본 범위 내에서만 고유해야 합니다. 여기서 원본 이름은 "Demo"이며 클래스 정의의 EventSourceAttribute에 지정되어 있습니다. 원본 이름은 공급자 이름이라고도 합니다.
- 인수 - 모든 메서드 인수 값이 직렬화됩니다.
- 기타 정보 - 이벤트에는 타임스탬프, 스레드 ID, 프로세서 ID, 활동 ID, 스택 추적 및 이벤트 메타데이터(예: 메시지 템플릿, 세부 정보 표시 수준, 키워드)가 포함될 수도 있습니다.
이벤트 만들기에 대한 자세한 내용 및 모범 사례는 이벤트를 만들기 위한 코드 계측을 참조하세요.
추적 파일 수집 및 확인
코드에는 어떤 이벤트를 활성화해야 하는지, 로그된 데이터를 어디로 보내야 하는지, 데이터를 어떤 형식으로 저장해야 하는지를 설명하는 필수 구성이 없습니다. 지금 앱을 실행하면 기본적으로 추적 파일이 생성되지 않습니다. EventSource는 구독자가 활성화되어야 하는 이벤트를 나타내고 구독된 이벤트에 대한 모든 직렬화를 제어하도록 요구하는 게시-구독 패턴을 사용합니다. EventSource에는 ETW(Windows용 이벤트 추적) 및 EventPipe(.NET Core에만 해당)에서의 구독을 위한 통합이 있습니다. System.Diagnostics.Tracing.EventListener API를 사용하여 사용자 지정 구독자를 만들 수도 있습니다.
이 데모에서는 .NET Core 앱에 대한 EventPipe 예제를 보여줍니다. 추가 옵션에 대해 알아보려면 이벤트 추적 수집 및 확인을 참조하세요. EventPipe는 .NET Core 런타임에 내장된 개방형 플랫폼 간 추적 기술로, .NET 개발자에게 추적 수집 도구와 이식 가능한 압축 추적 형식(*.nettrace 파일)을 제공합니다. dotnet-trace는 EventPipe 추적을 수집하는 명령줄 도구입니다.
- dotnet-trace를 다운로드 및 설치합니다.
- 위의 콘솔 앱을 빌드합니다. 이 데모에서는 앱 이름이 EventSourceDemo.exe이고 현재 디렉터리에 있다고 가정합니다. 명령줄에서 다음을 실행합니다.
>dotnet-trace collect --providers Demo -- EventSourceDemo.exe
다음과 유사한 출력이 표시됩니다.
Provider Name Keywords Level Enabled By
Demo 0xFFFFFFFFFFFFFFFF Verbose(5) --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_20220303_001619.nettrace
[00:00:00:00] Recording trace 0.00 (B)
Press <Enter> or <Ctrl+C> to exit...
Trace completed.
이 명령은 'Demo' EventSource의 모든 이벤트가 활성화된 상태에서 EventSourceDemo.exe를 실행하고 추적 파일 EventSourceDemo.exe_20220303_001619.nettrace
를 출력합니다.
Visual Studio에서 파일을 열면 로그된 이벤트가 표시됩니다.
목록 뷰에서 첫 번째 이벤트가 Demo/AppStarted 이벤트임을 확인할 수 있습니다. 텍스트 열에는 저장된 인수가 있고, 타임스탬프 열에는 로그 시작 27밀리초 후 이벤트가 발생했음이 표시되며, 오른쪽에서는 호출 스택을 볼 수 있습니다. 다른 이벤트는 dotnet-trace에 의해 수집된 모든 추적에서 자동으로 활성화되지만 방해가 되는 경우 UI의 뷰에서 무시하고 필터링할 수 있습니다. 이러한 추가 이벤트는 Visual Studio가 이벤트 스택 추적을 재구성할 수 있도록 하는 프로세스 및 JIT 컴파일된 코드에 대한 일부 정보를 캡처합니다.
EventSource에 대해 더 알아보기
.NET