Megosztás:


A Microsoft.Extensions.Logging használata az EF Core-ban

A Microsoft.Extensions.Logging egy bővíthető naplózási mechanizmus, amely számos gyakori naplózási rendszer beépülő szolgáltatóival rendelkezik. Mind a Microsoft által biztosított beépülő modulok (pl . Microsoft.Extensions.Logging.Console) és külső beépülő modulok (pl. Serilog.Extensions.Logging) NuGet-csomagokként érhetők el.

Az Entity Framework Core (EF Core) teljes mértékben integrálható a Microsoft.Extensions.Logging. Fontolja meg azonban az egyszerű naplózás használatát az egyszerűbb naplózáshoz, különösen olyan alkalmazások esetében, amelyek nem használnak függőséginjektálást.

ASP.NET Core-alkalmazások

Microsoft.Extensions.Logging alapértelmezés szerint ASP.NET Core-alkalmazásokban használatos. EF Core hívása a AddDbContext vagy AddDbContextPool automatikusan a naplózási beállítást használja, amely a szokásos ASP.NET mechanizmuson keresztül van konfigurálva.

Egyéb alkalmazástípusok

Más alkalmazástípusok a GenericHost használatával ugyanazokat a függőségi injektálási mintákat kapják, mint a ASP.NET Core-ban. AddDbContext vagy AddDbContextPool ugyanúgy használható, mint ASP.NET Core-alkalmazásokban.

Microsoft.Extensions.Logging függőséginjektálást nem használó alkalmazásokhoz is használható, bár az egyszerű naplózás egyszerűbben beállítható.

Microsoft.Extensions.Logging létrehozásához létre kell hozatni egy LoggerFactory. Ezt a gyárat statikus/globális példányként kell tárolni valahol, és minden alkalommal használni kell, amikor létrejön egy DbContext. Gyakori például, hogy a naplózó-előállító statikus tulajdonságként van tárolva a DbContextben.

public static readonly ILoggerFactory MyLoggerFactory
    = LoggerFactory.Create(builder => { builder.AddConsole(); });

Ezt az egytonos/globális példányt ezután regisztrálni kell az EF Core-on a DbContextOptionsBuilder. Például:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory)
        .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

Részletes üzenetek lekérése

Jótanács

Az OnConfiguring akkor is meghívható, ha AddDbContext van használatban, vagy egy DbContextOptions-példányt ad át a DbContext konstruktornak. Így ideális hely a környezetkonfigurációk alkalmazására a DbContext felépítésétől függetlenül.

Bizalmas adatok

Alapértelmezés szerint az EF Core nem fogja tartalmazni az adatok értékeit a kivételüzenetekben. Ennek az az oka, hogy ezek az adatok bizalmasak lehetnek, és az éles használatban is feltárhatók, ha nem kezelik a kivételt.

Az adatértékek ismerete, különösen a kulcsok esetében azonban nagyon hasznos lehet a hibakeresés során. Ez az EF Core-ban a hívással EnableSensitiveDataLogging()engedélyezhető. Például:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableSensitiveDataLogging();

Részletes lekérdezési kivételek

Teljesítmény okokból az EF Core nem csomagolja be egy try-catch blokkba az egyes hívásokat az adatbázis-szolgáltatótól származó értékek beolvasására. Ez azonban néha nehezen diagnosztizálható kivételeket eredményez, különösen akkor, ha az adatbázis null értéket ad vissza, ha a modell nem engedélyezi.

Ha EnableDetailedErrors be van kapcsolva, az EF bevezeti ezeket a try-catch blokkokat, és részletesebb hibainformációkat biztosít. Például:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableDetailedErrors();

Adott üzenetek konfigurálása

Az EF Core ConfigureWarnings API lehetővé teszi az alkalmazások számára, hogy megváltoztatják, mi történik egy adott esemény bekövetkezésekor. Ez a következő célra használható:

  • Az esemény naplózási szintjének módosítása
  • Az esemény teljes naplózásának kihagyása
  • Kivétel küldése az esemény bekövetkezésekor

Esemény naplószintjének módosítása

Néha hasznos lehet egy esemény előre definiált naplószintjének módosítása. Például, ez felhasználható két további esemény LogLevel.DebugLogLevel.Information népszerűsítésére:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(
            b => b.Log(
                (RelationalEventId.ConnectionOpened, LogLevel.Information),
                (RelationalEventId.ConnectionClosed, LogLevel.Information)));

Esemény naplózásának letiltása

Hasonló módon az egyes eseményeket el lehet tiltani a naplózásból. Ez különösen akkor hasznos, ha figyelmen kívül hagy egy áttekintett és megértett figyelmeztetést. Például:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));

Eseményre való dobás

Végül az EF Core konfigurálható úgy, hogy egy adott eseményhez dobjon. Ez különösen hasznos, ha egy figyelmeztetést hibává változtatunk. (Valójában ez volt a módszer eredeti célja ConfigureWarnings , ezért a név.) Például:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));

Szűrés és egyéb konfiguráció

A naplószűréssel és más konfigurációval kapcsolatos útmutatásért tekintse meg a naplózást a .NET-ben .

Az EF Core-naplózási események az alábbiak egyikében vannak definiálva:

  • CoreEventId az összes EF Core-adatbázis-szolgáltató számára gyakori események esetén
  • RelationalEventId az összes relációsadatbázis-szolgáltató számára gyakori események esetén
  • Hasonló osztály az aktuális adatbázis-szolgáltatóhoz tartozó eseményekhez. Például SqlServerEventId az SQL Server-szolgáltató esetében.

Ezek a definíciók tartalmazzák az eseményazonosítókat, a naplószintet és a kategóriát az egyes eseményekhez, ahogyan azt a Microsoft.Extensions.Logging használja.