.NET-naplózás és nyomkövetés

A kód egy napló létrehozásához használható, amely a program futása közben történt érdekes események rekordjaként szolgál. Az alkalmazás viselkedésének megértéséhez a naplók áttekinthetők. A naplózás és a nyomkövetés is magában foglalja ezt a technikát. A .NET számos különböző naplózási API-t halmozott fel az előzmények során, és ez a cikk segít megérteni, hogy milyen lehetőségek érhetők el.

A "naplózás" és a "nyomkövetés" kifejezés gyakran szinonimák. A különbség az, hogy a naplózási kimenetet várhatóan folyamatosan gyűjtik, ezért alacsony terheléssel kell rendelkeznie. A nyomkövetés általában invazívabb, és több információt gyűjt az alkalmazás mélyebb részeiből és a .NET-futtatókörnyezetből. Adott problémák diagnosztizálásához vagy automatikusan, rövid ideig, mélyebb teljesítményelemzési rendszerek részeként használják.

A nyomkövetési kifejezés másik kimutatása az Elosztott nyomkövetés. Az elosztott nyomkövetés magas szintű tevékenység- és időzítési adatokat gyűjt a kérésalapú rendszerekhez, és korrelálja a kéréseket a szolgáltatások között, hogy képet kapjon arról, hogyan dolgozzák fel az egyes kéréseket a teljes rendszer.

Főbb megkülönböztetések a naplózási API-kban

Strukturált naplózás

A naplózási API-k strukturálhatók vagy strukturálatlanok lehetnek:

  • Strukturálatlan: A naplóbejegyzések szabad formátumú szöveges tartalommal rendelkeznek, amelyeket az emberek meg szeretnének tekinteni.
  • Strukturált: A naplóbejegyzések jól definiált sémával rendelkeznek, és különböző bináris és szöveges formátumban kódolhatók. Ezek a naplók úgy vannak kialakítva, hogy gépi fordításra és lekérdezhetővé legyenek, hogy az emberek és az automatizált rendszerek is könnyen működjenek velük.

A strukturált naplózást támogató API-k előnyben részesítik a nem triviális használatot. Több funkciót, rugalmasságot és teljesítményt kínálnak, a használhatóság terén pedig kevés különbség van.

Konfiguráció

Egyszerű használati esetekben érdemes lehet olyan API-kat használni, amelyek közvetlenül írnak üzeneteket a konzolra vagy egy fájlba. A legtöbb szoftverprojekt azonban hasznosnak fogja találni annak konfigurálását, hogy mely naplóeseményeket rögzíti a rendszer, és hogyan őrizze meg őket. Ha például helyi fejlesztői környezetben fut, érdemes egyszerű szöveget kiírni a konzolra az egyszerű olvashatóság érdekében. Ezután az alkalmazás éles környezetben való üzembe helyezésekor válthat úgy, hogy a naplók egy dedikált adatbázisban vagy egy gördülő fájlkészletben legyenek tárolva. A megfelelő konfigurációs beállításokkal rendelkező API-k megkönnyítik az áttűnést, míg a kevésbé konfigurálható beállításokhoz mindenhol frissíteni kell a rendszerállapot-kódot a módosítások elvégzéséhez.

Mosogató

A legtöbb naplózási API lehetővé teszi a naplóüzenetek küldését különböző, fogadóknak nevezett helyekre. Egyes API-k nagy számú előre elkészített fogadóval rendelkeznek, míg másoknak csak néhányuk van. Ha nincs előre elkészített fogadó, általában van egy bővíthetőségi API, amely lehetővé teszi egy egyéni fogadó készítését, bár ehhez egy kicsit több kódot kell írnia.

.NET-naplózási API-k

ILogger

A legtöbb esetben, akár meglévő projekthez ad naplózást, akár új projektet hoz létre, az ILogger-infrastruktúra jó alapértelmezett választás. ILoggerTámogatja a gyors strukturált naplózást, a rugalmas konfigurációt és a gyakori fogadók gyűjteményét, beleértve a konzolt is, amelyet egy ASP.NET-alkalmazás futtatásakor láthat. Emellett a ILogger felület számos külső naplózási implementáció homlokzataként is szolgálhat, amelyek gazdag funkcionalitást és bővíthetőséget biztosítanak.

Az ILogger a .NET OpenTelemetry-implementációjának naplózási történetét tartalmazza, amely lehetővé teszi a naplóknak az alkalmazásból a különböző APM-rendszerekbe való kimenő forgalmát a további elemzéshez.

EventSource

Az EventSource egy régebbi, nagy teljesítményű nyomkövetési API strukturált naplózással. Eredetileg úgy tervezték, hogy jól integrálható legyen a Windows eseménykövetésével (ETW), de később kiterjesztették az EventPipe platformfüggetlen nyomkövetésére és EventListener az egyéni fogadókra. Ehhez képest ILoggerviszonylag kevés előre elkészített naplózási fogadóval rendelkezik, EventSource és nincs beépített támogatás a különálló konfigurációs fájlokon keresztüli konfiguráláshoz. EventSourcekiváló, ha szorosabb ellenőrzést szeretne az ETW vagy az EventPipe integráció felett, de az általános célú naplózáshoz ILogger rugalmasabb és könnyebben használható.

Trace

System.Diagnostics.Trace és System.Diagnostics.Debug vannak. A NET legrégebbi naplózási API-i. Ezek az osztályok rugalmas konfigurációs API-kkal és fogadók nagy ökoszisztémával rendelkeznek, de csak a strukturálatlan naplózást támogatják. Az .NET-keretrendszer app.config fájlon keresztül konfigurálhatók, de a .NET Core-ban nincs beépített fájlalapú konfigurációs mechanizmus. Ezeket általában a hibakereső alatt futtatott fejlesztő diagnosztikai kimenetének előállítására használják. A .NET csapata továbbra is támogatja ezeket az API-kat a visszamenőleges kompatibilitás érdekében, de új funkciók nem lesznek hozzáadva. Ezek az API-k kiváló választásnak számítanak a már használt alkalmazásokhoz. Az újabb alkalmazások esetében, amelyek még nem kötelezték el magukat a naplózási API-ra, ILogger jobb funkciókat biztosíthatnak.

Speciális naplózási API-k

Console

Az System.Console osztály rendelkezik az Write egyszerű naplózási forgatókönyvekben használható módszerekkel és WriteLine módszerekkel. Ezeket az API-kat nagyon könnyű elkezdeni, de a megoldás nem lesz olyan rugalmas, mint egy általános célú naplózási API. A konzol csak strukturálatlan naplózást tesz lehetővé, és nincs konfigurációs támogatás annak kiválasztásához, hogy mely naplóüzenetek engedélyezve vannak, vagy egy másik fogadóba. Az ILogger vagy a Trace API-k konzolos fogadóval való használata nem igényel sok erőfeszítést, és konfigurálható marad a naplózás.

DiagnosticSource

System.Diagnostics.DiagnosticSource naplózásra szolgál, ahol a naplóüzenetek szinkron módon lesznek elemezve, nem pedig bármilyen tárolóba szerializálva. Ez lehetővé teszi, hogy a forrás és a figyelő tetszőleges .NET-objektumokat váltson üzenetekként, míg a legtöbb naplózási API megköveteli a naplóesemény szerializálhatóvá tételét. Ez a technika rendkívül gyors is lehet, és több tíz nanoszekundumban kezeli a naplóeseményeket, ha a figyelőt hatékonyan implementálják. Az ezeket az API-kat használó eszközök gyakran inkább a folyamaton belüli profilkészítőkhez hasonlóan működnek, bár az API itt nem ír elő semmilyen korlátozást.

Eseménynapló

System.Diagnostics.EventLog Csak Windows API, amely üzeneteket ír a Windows EventLogba. Az ILogger opcionális EventLog-fogadóval való használata windowsos futtatáskor sok esetben hasonló funkciót biztosíthat anélkül, hogy szorosan összekapcsolja az alkalmazást a Windows operációs rendszerrel.