Protokolování a trasování rozhraní .NET

Kód lze instrumentovat k vytvoření protokolu, který slouží jako záznam zajímavých událostí, ke kterým došlo při spuštění programu. Pokud chcete porozumět chování aplikace, můžete si projít protokoly. Protokolování i trasování zapouzdřují tuto techniku. Rozhraní .NET v historii nashromáždilo několik různých rozhraní API protokolování a tento článek vám pomůže pochopit, jaké možnosti jsou k dispozici.

Termíny "protokolování" a "trasování" jsou obvykle synonymem. Rozdíl spočívá v tom, že se očekává, že se výstup protokolování bude shromažďovat po celou dobu, a proto by měl mít nízkou režii. Trasování je obvykle invazivnější a shromažďuje více informací z hlubších částí aplikace a modulu runtime .NET. Používá se buď při diagnostice konkrétních problémů, nebo automaticky po krátkou dobu jako součást hlubších systémů analýzy výkonu.

Dalším pivotem termínu trasování je distribuované trasování. Distribuované trasování shromažďuje data o aktivitách vysoké úrovně a časování pro systémy založené na požadavcích a koreluje požadavky napříč službami a poskytuje přehled o tom, jak se jednotlivé požadavky zpracovávají kompletním systémem.

Klíčové rozdíly v rozhraních API protokolování

Strukturované protokolování

Rozhraní API protokolování můžou být strukturovaná nebo nestrukturovaná:

  • Nestrukturovaná: Položky protokolu mají volný textový obsah, který má být zobrazen lidmi.
  • Strukturovaná: Položky protokolu mají dobře definované schéma a lze je zakódovat v různých binárních a textových formátech. Tyto protokoly jsou navržené tak, aby byly strojově přeložitelné a dotazovatelné, aby s nimi lidé i automatizované systémy mohli snadno pracovat.

Rozhraní API, která podporují strukturované protokolování, jsou vhodnější pro jiné než triviální použití. Nabízejí větší funkčnost, flexibilitu a výkon s malým rozdílem v použitelnosti.

Konfigurace

V případě jednoduchých případů použití můžete chtít použít rozhraní API, která přímo zapisují zprávy do konzoly nebo souboru. Většina softwarových projektů ale bude užitečná při konfiguraci událostí protokolu, které se zaznamenávají a jak se uchovávají. Například při spuštění v místním vývojovém prostředí můžete chtít výstup prostého textu do konzoly, aby byla snadno čitelná. Když se pak aplikace nasadí do produkčního prostředí, můžete přepnout na protokoly uložené ve vyhrazené databázi nebo v sadě kumulativních souborů. Rozhraní API s dobrými možnostmi konfigurace tyto přechody zjednoduší, zatímco méně konfigurovatelné možnosti by vyžadovaly aktualizaci kódu instrumentace všude, aby bylo možné provádět změny.

Propadů

Většina rozhraní API protokolování umožňuje odesílání zpráv protokolu do různých cílů označovaných jako jímky. Některá rozhraní API mají velký počet předpřipravených jímek, zatímco jiná mají jen několik. Pokud neexistuje žádná předem vytvořená jímka, obvykle existuje rozhraní API rozšiřitelnosti, které vám umožní vytvořit vlastní jímku, i když to vyžaduje psaní trochu více kódu.

Rozhraní API pro protokolování .NET

ILogger

Ve většiněpřípadůch ILogger podporuje rychlé strukturované protokolování, flexibilní konfiguraci a kolekci běžných jímek včetně konzoly , která se zobrazí při spuštění aplikace ASP.NET. ILogger Rozhraní také může sloužit jako fasáda nad mnoha implementacemi protokolování třetích stran, které nabízejí bohaté funkce a rozšiřitelnost.

ILogger poskytuje protokolovací scénář pro implementaci OpenTelemetry pro .NET, což umožňuje odchozí přenos protokolů z vaší aplikace do různých systémů APM pro další analýzu.

EventSource

EventSource je starší vysoce výkonné rozhraní API pro trasování se strukturovaným protokolováním. Původně byla navržena tak, aby se dobře integrovala s trasováním událostí pro Windows (ETW), ale později byla rozšířena tak, aby podporovala trasování událostí EventPipe pro různé platformy a EventListener pro vlastní jímky. Oproti ILoggertomu EventSource má relativně málo předdefinovaných jímek protokolování a neexistuje žádná integrovaná podpora konfigurace prostřednictvím samostatných konfiguračních souborů. EventSource je vynikající, pokud chcete mít větší kontrolu nad integrací EtW nebo EventPipe , ale pro protokolování pro obecné účely je ILogger flexibilnější a jednodušší.

Trasování

System.Diagnostics.Trace a System.Diagnostics.Debug jsou . Rozhraní API pro nejstarší protokolování rozhraní NET. Tyto třídy mají flexibilní rozhraní API konfigurace a velký ekosystém jímek, ale podporují pouze nestrukturované protokolování. V rozhraní .NET Framework je možné je nakonfigurovat prostřednictvím souboru app.config, ale v .NET Core neexistuje žádný integrovaný konfigurační mechanismus založený na souborech. Obvykle se používají k vytvoření výstupu diagnostiky pro vývojáře při spuštění v ladicím programu. Tým .NET nadále podporuje tato rozhraní API pro účely zpětné kompatibility, ale nebudou přidány žádné nové funkce. Tato rozhraní API jsou skvělou volbou pro aplikace, které je už používají. V případě novějších aplikací, které ještě nejsou potvrzené do rozhraní API protokolování, ILogger můžou nabízet lepší funkce.

Specializovaná rozhraní API protokolování

Konzola

Třída System.Console má metody Write a WriteLine metody, které lze použít v jednoduchých scénářích protokolování. Tato rozhraní API jsou velmi snadná, ale řešení nebude tak flexibilní jako rozhraní API pro protokolování pro obecné účely. Konzola umožňuje pouze nestrukturované protokolování a není k dispozici žádná podpora konfigurace pro výběr povolených zpráv protokolu nebo změna cílení na jinou jímku. Použití rozhraní ILogger nebo Trace API s jímkou konzoly nezabírají příliš mnoho úsilí a protokolování je možné konfigurovat.

DiagnosticSource

System.Diagnostics.DiagnosticSource je určen pro protokolování, kde se zprávy protokolu budou analyzovat synchronně v procesu, nikoli serializovány do jakéhokoli úložiště. To umožňuje zdrojovému a naslouchacímu procesu výměnu libovolných objektů .NET jako zpráv, zatímco většina rozhraní API protokolování vyžaduje serializovatelnou událost protokolu. Tato technika může být také extrémně rychlá, zpracování událostí protokolu v desítkách nanosekund, pokud je naslouchací proces implementovaný efektivně. Nástroje, které tato rozhraní API používají, často fungují spíše jako profilátory v procesu, i když toto rozhraní API neukládá žádné omezení.

EventLog

System.Diagnostics.EventLog je rozhraní API pouze pro Windows, které zapisuje zprávy do protokolu událostí systému Windows. V mnoha případech může použití ILoggeru s volitelnou jímkou EventLog při spuštění ve Windows poskytovat podobné funkce bez těsného propojení aplikace s operačním systémem Windows.