Rejestrowanie i śledzenie platformy .NET

Kod może być instrumentowany w celu utworzenia dziennika, który służy jako rekord interesujących zdarzeń, które wystąpiły podczas uruchamiania programu. Aby zrozumieć zachowanie aplikacji, można przejrzeć dzienniki. Rejestrowanie i śledzenie obu hermetyzuje tę technikę. Platforma .NET zgromadziła kilka różnych interfejsów API rejestrowania w swojej historii, a ten artykuł pomoże Ci zrozumieć, jakie opcje są dostępne.

Terminy "rejestrowanie" i "śledzenie" są często synonimami. Rozróżnienie polega na tym, że dane wyjściowe rejestrowania powinny być zbierane przez cały czas i dlatego powinny mieć niskie obciążenie. Śledzenie jest zwykle bardziej inwazyjne i zbiera więcej informacji z bardziej szczegółowych części aplikacji i środowiska uruchomieniowego platformy .NET. Jest on używany podczas diagnozowania określonych problemów lub automatycznie przez krótki okres czasu w ramach bardziej szczegółowych systemów analizy wydajności.

Innym elementem przestawnym terminu śledzenia jest śledzenie rozproszone. Śledzenie rozproszone zbiera dane o wysokim poziomie aktywności i chronometrażu dla systemów opartych na żądaniach i koreluje żądania między usługami w celu zapewnienia wglądu w sposób przetwarzania każdego żądania przez cały system.

Kluczowe różnice w interfejsach API rejestrowania

Rejestrowanie strukturalne

Interfejsy API rejestrowania mogą być ustrukturyzowane lub nieustrukturyzowane:

  • Nieustrukturyzowane: wpisy dziennika mają zawartość tekstową, która ma być przeglądana przez ludzi.
  • Ustrukturyzowane: Wpisy dziennika mają dobrze zdefiniowany schemat i mogą być kodowane w różnych formatach binarnych i tekstowych. Te dzienniki są przeznaczone do translacji maszyn i wykonywania zapytań, dzięki czemu zarówno ludzie, jak i zautomatyzowane systemy mogą z nimi łatwo współpracować.

Interfejsy API, które obsługują rejestrowanie ustrukturyzowane, są preferowane w przypadku nietrygalnego użycia. Oferują one większą funkcjonalność, elastyczność i wydajność z niewielką różnicą w użyteczności.

Konfigurowanie

W prostych przypadkach użycia możesz użyć interfejsów API, które bezpośrednio zapisują komunikaty w konsoli lub pliku. Jednak większość projektów oprogramowania przyda się do skonfigurowania, które zdarzenia dziennika są rejestrowane i jak są utrwalane. Na przykład podczas uruchamiania w lokalnym środowisku deweloperskim możesz chcieć wyświetlić zwykły tekst w konsoli, aby ułatwić czytelność. Następnie po wdrożeniu aplikacji w środowisku produkcyjnym można przełączyć się na dzienniki przechowywane w dedykowanej bazie danych lub zestawie plików rolowanych. Interfejsy API z dobrymi opcjami konfiguracji ułatwią te przejścia, natomiast mniej konfigurowalne opcje wymagają aktualizacji kodu instrumentacji wszędzie w celu wprowadzenia zmian.

Umywalki

Większość interfejsów API rejestrowania umożliwia wysyłanie komunikatów dziennika do różnych miejsc docelowych nazywanych ujściami. Niektóre interfejsy API mają dużą liczbę wstępnie wykonanych zlewów, podczas gdy inne mają tylko kilka. Jeśli nie istnieje wstępnie utworzony ujście, zwykle istnieje interfejs API rozszerzalności, który umożliwi tworzenie niestandardowego ujścia, chociaż wymaga to nieco więcej kodu.

Interfejsy API rejestrowania platformy .NET

ILogger

W większości przypadków dodanie rejestrowania do istniejącego projektu lub utworzenie nowego projektu jest dobrym wyborem domyślnym. ILogger Obsługuje szybkie rejestrowanie strukturalne, elastyczną konfigurację i kolekcję typowych ujściów , w tym konsoli, co jest widoczne podczas uruchamiania aplikacji ASP.NET. ILogger Ponadto interfejs może również służyć jako fasada w wielu implementacjach rejestrowania innych firm, które oferują zaawansowane funkcje i rozszerzalność.

Usługa ILogger udostępnia historię rejestrowania implementacji biblioteki OpenTelemetry dla platformy .NET, która umożliwia wychodzące dzienniki z aplikacji do różnych systemów APM w celu dalszej analizy.

EventSource

EventSource to starszy interfejs API śledzenia o wysokiej wydajności z rejestrowaniem ustrukturyzowanym. Pierwotnie została zaprojektowana tak, aby dobrze integrowała się z funkcją Śledzenie zdarzeń dla systemu Windows (ETW), ale została później rozszerzona o obsługę śledzenia międzyplatformowego eventPipe i EventListener niestandardowych ujść. W porównaniu z ILoggerprogramem EventSource ma stosunkowo niewiele wstępnie wykonanych ujść rejestrowania i nie ma wbudowanej obsługi konfigurowania za pośrednictwem oddzielnych plików konfiguracji. EventSource jest doskonały, jeśli chcesz ściślejsza kontrola nad integracją ETW lub EventPipe , ale w przypadku rejestrowania ogólnego przeznaczenia jest ILogger bardziej elastyczna i łatwiejsza w użyciu.

Śledzenie

System.Diagnostics.Trace i System.Diagnostics.Debug to . Najstarsze interfejsy API rejestrowania platformy NET. Te klasy mają elastyczne interfejsy API konfiguracji i duży ekosystem ujścia, ale obsługują tylko rejestrowanie bez struktury. W programie .NET Framework można je skonfigurować za pośrednictwem pliku app.config, ale na platformie .NET Core nie ma wbudowanego mechanizmu konfiguracji opartego na plikach. Są one zwykle używane do tworzenia danych wyjściowych diagnostycznych dla dewelopera podczas działania w debugerze. Zespół platformy .NET nadal obsługuje te interfejsy API na potrzeby zgodności z poprzednimi wersjami, ale nie zostaną dodane żadne nowe funkcje. Te interfejsy API są dobrym wyborem dla aplikacji, które już ich używają. W przypadku nowszych aplikacji, które nie zostały jeszcze zatwierdzone do interfejsu API rejestrowania, ILogger mogą oferować lepszą funkcjonalność.

Wyspecjalizowane interfejsy API rejestrowania

Konsola

Klasa System.Console ma Write metody i WriteLine , które mogą być używane w prostych scenariuszach rejestrowania. Te interfejsy API są bardzo łatwe do rozpoczęcia pracy, ale rozwiązanie nie będzie tak elastyczne, jak interfejs API rejestrowania ogólnego przeznaczenia. Konsola zezwala tylko na rejestrowanie bez struktury i nie ma obsługi konfiguracji, aby wybrać, które komunikaty dzienników są włączone lub do ponownego pobierania do innego ujścia. Korzystanie z interfejsów API ILogger lub Trace z ujściem konsoli nie wymaga większego nakładu pracy i zapewnia możliwość konfigurowania rejestrowania.

DiagnosticSource

System.Diagnostics.DiagnosticSource jest przeznaczony do rejestrowania, w którym komunikaty dziennika będą analizowane synchronicznie w procesie, a nie serializowane do dowolnego magazynu. Dzięki temu źródło i odbiornik mogą wymieniać dowolne obiekty platformy .NET jako komunikaty, natomiast większość interfejsów API rejestrowania wymaga serializacji zdarzenia dziennika. Ta technika może być również bardzo szybka, obsługa zdarzeń dziennika w dziesiątkach nanosekund, jeśli odbiornik jest implementowany wydajnie. Narzędzia korzystające z tych interfejsów API często działają bardziej jak profilerzy procesów, chociaż interfejs API nie nakłada żadnych ograniczeń w tym miejscu.

EventLog

System.Diagnostics.EventLog to tylko interfejs API systemu Windows, który zapisuje komunikaty w dzienniku zdarzeń systemu Windows. W wielu przypadkach używanie protokołu ILogger z opcjonalnym ujściem dziennika zdarzeń podczas uruchamiania w systemie Windows może zapewnić podobną funkcjonalność bez ścisłego sprzężenia aplikacji z systemem operacyjnym Windows.