Udostępnij za pośrednictwem


Zbieranie i wyświetlanie śladów źródła zdarzeń

Ten artykuł dotyczy: ✔️ .NET Core 3.1 i nowsze wersje ✔️ .NET Framework 4.5 i nowszych wersjach

W przewodniku Wprowadzenie pokazano, jak utworzyć minimalne źródło zdarzeń i zebrać zdarzenia w pliku śledzenia. W tym samouczku pokazano, jak różne narzędzia mogą konfigurować, które zdarzenia są zbierane w śladzie, a następnie wyświetlać ślady.

Przykładowa aplikacja

Użyjesz następującej przykładowej aplikacji, która generuje zdarzenia dla tego samouczka. Skompiluj aplikację konsolową platformy .NET zawierającą następujący kod:

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

Konfigurowanie zdarzeń do zbierania

Większość narzędzi zbierania zdarzeń używa tych opcji konfiguracji, aby zdecydować, które zdarzenia powinny być uwzględnione w śladzie:

  • Nazwy dostawców — jest to lista co najmniej jednej nazwy źródła zdarzeń. Na tej liście można uwzględnić tylko zdarzenia zdefiniowane na liście EventSources. Aby zebrać zdarzenia z klasy DemoEventSource w poprzedniej przykładowej aplikacji, należy dołączyć nazwę źródła zdarzeń "Demo" na liście nazw dostawców.
  • Poziom szczegółowości zdarzeń — dla każdego dostawcy można zdefiniować poziom szczegółowości i zdarzenia o szczegółowości wyższej niż ten poziom zostanie wykluczony ze śledzenia. Jeśli określono, że dostawca "Demo" w poprzedniej przykładowej aplikacji powinien zbierać się na poziomie szczegółowości informacyjnej, zdarzenie DebugMessage zostanie wykluczone, ponieważ ma wyższy poziom. Określenie EventLevel wartości LogAlways(0) jest specjalnym przypadkiem wskazującym, że należy uwzględnić zdarzenia dowolnego poziomu szczegółowości.
  • Słowa kluczowe zdarzenia — dla każdego dostawcy można zdefiniować zestaw słów kluczowych i uwzględniane będą tylko zdarzenia oznaczone co najmniej jednym ze słów kluczowych. W przykładowej aplikacji powyżej, jeśli określono słowo kluczowe Startup, zostaną uwzględnione tylko zdarzenia AppStarted i DebugMessage. Jeśli nie określono żadnych słów kluczowych, jest to specjalny przypadek i oznacza, że należy uwzględnić zdarzenia z dowolnym słowem kluczowym.

Konwencje opisujące konfigurację dostawcy

Chociaż każde narzędzie określa własny interfejs użytkownika do ustawiania konfiguracji śledzenia, istnieje powszechna konwencja, która jest używana podczas określania konfiguracji jako ciągu tekstowego. Lista dostawców jest określana jako lista rozdzielana średnikami, a każdy element dostawcy na liście składa się z nazw, słów kluczowych i poziomów rozdzielonych dwukropkami. Na przykład "Demo:3:5" identyfikuje źródło zdarzeń o nazwie "Demo" z maską bitową słowa kluczowego 3 ( Startup bit i bit) oraz RequestsEventLevel 5, czyli Verbose. Wiele narzędzi pozwala również pominąć poziom i słowa kluczowe, jeśli nie jest wymagany żaden poziom lub filtrowanie słów kluczowych. Na przykład "Demo::5" tylko filtruje na poziomie, "Demo:3" tylko filtruje oparte na słowach kluczowych, a "Demo" nie wykonuje filtrowania na poziomie ani słowa kluczowego.

Visual Studio

Profiler programu Visual Studio obsługuje zbieranie i wyświetlanie śladów. Może również wyświetlać ślady, które zostały zebrane z wyprzedzeniem przez inne narzędzia, takie jak dotnet-trace.

Zbieranie śladu

Większość narzędzi profilowania programu Visual Studio używa wstępnie zdefiniowanych zestawów zdarzeń, które służą do określonego celu, takich jak analizowanie użycia procesora CPU lub alokacji. Aby zebrać ślad z dostosowanymi zdarzeniami, użyjesz narzędzia Podgląd zdarzeń .

  1. Aby otworzyć profilera wydajności w programie Visual Studio, wybierz pozycję Alt+F2.

  2. Zaznacz pole wyboru Podgląd zdarzeń .

    Podgląd zdarzeń programu Visual Studio

  3. Wybierz małą ikonę koła zębatego po prawej stronie Podgląd zdarzeń, aby otworzyć okno konfiguracji.

    W poniższej tabeli Dodatkowe dostawcy dodaj wiersz dla każdego dostawcy, który chcesz skonfigurować, klikając pole wyboru Włączone , a następnie wprowadzając nazwę dostawcy, słowa kluczowe i poziom. Nie musisz wprowadzać identyfikatora GUID dostawcy; jest obliczana automatycznie.

    Ustawienia podglądu zdarzeń programu Visual Studio

  4. Wybierz przycisk OK , aby potwierdzić ustawienia konfiguracji.

  5. Wybierz pozycję Rozpocznij, aby rozpocząć uruchamianie aplikacji i zbieranie dzienników.

  6. Wybierz pozycję Zatrzymaj zbieranie lub zamknij aplikację, aby zatrzymać zbieranie dzienników i pokazać zebrane dane.

Wyświetlanie śladu

Program Visual Studio może wyświetlać zebrane ślady lub wyświetlać ślady zebrane w innych narzędziach. Aby wyświetlić ślady z innych narzędzi, użyj pozycji Plik>otwórz i wybierz plik śledzenia w selektorze plików. Profiler programu Visual Studio obsługuje pliki etl (standardowy format ETW), pliki .nettrace (standardowy format eventPipe) i pliki diagsession (standardowy format programu Visual Studio). Aby uzyskać informacje na temat pracy z plikami śledzenia w programie Visual Studio, zobacz dokumentację programu Visual Studio.

Śledzenie ETW podglądu zdarzeń programu Visual Studio

Uwaga

Program Visual Studio automatycznie zbiera niektóre zdarzenia z etW lub EventPipe, nawet jeśli nie zostały jawnie skonfigurowane. Jeśli zdarzenia nie są rozpoznawane w kolumnie Nazwa dostawcy lub Nazwa zdarzenia i chcesz je odfiltrować, użyj ikony filtru po prawej stronie, aby wybrać tylko zdarzenia, które chcesz wyświetlić.

Narzędzie PerfView

PerfView to narzędzie wydajności utworzone przez zespół platformy .NET, które może zbierać i wyświetlać ślady ETW. Może również wyświetlać pliki śledzenia zebrane przez inne narzędzia w różnych formatach. W tym samouczku zbierzesz ślad ETW aplikacji demonstracyjnej , a następnie zbadasz zebrane zdarzenia w podglądzie zdarzeń programu PerfView.

Zbieranie śladu

  1. Pobierz aplikację PerfView ze strony wydań. Ten samouczek został wykonany z programem PerfView w wersji 2.0.76, ale każda najnowsza wersja powinna działać.

  2. Rozpocznij PerfView.exe z uprawnieniami administratora.

    Uwaga

    Zbieranie śladów ETW zawsze wymaga uprawnień administratora, jednak jeśli używasz tylko narzędzia PerfView do wyświetlania wstępnie istniejącego śledzenia, nie są potrzebne żadne specjalne uprawnienia.

    Okno główne narzędzia PerfView

  3. Z menu Zbieranie wybierz pozycję Uruchom. Spowoduje to otwarcie nowego okna dialogowego, w którym wprowadzisz ścieżkę do aplikacji demonstracyjnej.

    Okno dialogowe uruchamiania narzędzia PerfView

  4. Aby skonfigurować zbierane zdarzenia, rozwiń pozycję Opcje zaawansowane w dolnej części okna dialogowego. W polu tekstowym Dodatkowi dostawcy wprowadź dostawców przy użyciu konwencjonalnego formatu tekstu opisanego wcześniej. W takim przypadku wprowadzasz wartość "Demo:1:4", co oznacza słowo kluczowe bit 1 (Startup zdarzenia) i czasownik 4 (Informational).

    Ustawienia zaawansowane okna dialogowego uruchamiania narzędzia PerfView

  5. Aby uruchomić aplikację i rozpocząć zbieranie śladu, wybierz przycisk Uruchom polecenie . Po zakończeniu działania aplikacji ślad PerfViewData.etl jest zapisywany w bieżącym katalogu.

Wyświetlanie śladu

  1. W głównym oknie rozwijanym pole tekstowe w lewym górnym rogu wybierz katalog zawierający plik śledzenia. Następnie kliknij dwukrotnie plik śledzenia w widoku drzewa poniżej.

    Okno główne narzędzia PerfView — wybieranie śladu

  2. Aby wyświetlić podgląd zdarzeń, kliknij dwukrotnie element Zdarzenia , który jest wyświetlany w widoku drzewa poniżej pliku śledzenia.

    Podgląd zdarzeń narzędzia PerfView

  3. Wszystkie typy zdarzeń w śladzie są wyświetlane na liście po lewej stronie. Kliknij dwukrotnie typ zdarzenia, taki jak Demo\AppStarted, aby wyświetlić wszystkie zdarzenia tego typu w tabeli po prawej stronie.

    Zdarzenia podglądu zdarzeń narzędzia PerfView — zdarzeniaStarted

Więcej tutaj

Aby dowiedzieć się więcej na temat korzystania z narzędzia PerfView, zobacz samouczki wideo narzędzia PerfView.

dotnet-trace

dotnet-trace to wieloplatformowe narzędzie wiersza polecenia, które może zbierać ślady z aplikacji platformy .NET Core przy użyciu śledzenia eventPipe . Nie obsługuje wyświetlania danych śledzenia, ale zbierane ślady mogą być wyświetlane przez inne narzędzia, takie jak PerfView lub Visual Studio. funkcja dotnet-trace obsługuje również konwertowanie domyślnych śladów formatu .nettrace na inne formaty, takie jak Chromium lub Speedscope.

Zbieranie śladu

  1. Pobierz i zainstaluj narzędzie dotnet-trace.

  2. W wierszu polecenia uruchom polecenie dotnet-trace collect :

    E:\temp\EventSourceDemo\bin\Debug\net6.0>dotnet-trace collect --providers Demo:1:4 -- EventSourceDemo.exe
    

    Powinno to spowodować wyświetlenie danych wyjściowych podobnych do następujących:

    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 używa konwencjonalnego formatu tekstowego do opisywania konfiguracji dostawcy w argumencie --providers . Aby uzyskać więcej opcji na temat pobierania śladów przy użyciu narzędzia dotnet-trace, zobacz dokumentację dotnet-trace.

Eventlistener

System.Diagnostics.Tracing.EventListener to interfejs API platformy .NET, który może być używany z procesu do odbierania wywołań zwrotnych dla zdarzeń generowanych przez element System.Diagnostics.Tracing.EventSource. Ten interfejs API może służyć do tworzenia niestandardowych narzędzi rejestrowania lub analizowania zdarzeń w pamięci bez serializacji ich.

Aby użyć EventListenermetody , zadeklaruj typ pochodzący z EventListenerklasy , wywołaj polecenie EnableEvents w celu zasubskrybowania zdarzeń z dowolnego źródła zdarzeń i przesłonięć OnEventWrittenelement , który będzie wywoływany za każdym razem, gdy jest dostępne nowe zdarzenie. Często warto zastąpić OnEventSourceCreated , aby wykryć, które obiekty usługi EventSource istnieją, ale nie jest to wymagane. Poniżej przedstawiono przykładową EventListener implementację, która drukuje do konsoli po odebraniu komunikatów:

  1. Dodaj ten kod do aplikacji demonstracyjnej.

    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);
        }
    }
    
  2. Zmodyfikuj metodę, Main aby utworzyć wystąpienie nowego odbiornika.

    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. Skompiluj i uruchom aplikację. Wcześniej nie miał żadnych danych wyjściowych, ale teraz zapisuje zdarzenia w konsoli:

    3/24/2022 9:23:35 AM AppStarted
    3/24/2022 9:23:35 AM RequestStart
    3/24/2022 9:23:35 AM RequestStop