Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Microsoft.Extensions.Logging to rozszerzalny mechanizm rejestrowania z dostawcami wtyczek dla wielu typowych systemów rejestrowania. Wtyczki dostarczane przez firmę Microsoft (np. Microsoft.Extensions.Logging.Console) i wtyczki innych firm (np. Serilog.Extensions.Logging) są dostępne jako pakiety NuGet.
Entity Framework Core (EF Core) w pełni integruje się z Microsoft.Extensions.Logging. Należy jednak rozważyć użycie prostego rejestrowania , aby uzyskać prostszy sposób rejestrowania, zwłaszcza w przypadku aplikacji, które nie używają wstrzykiwania zależności.
aplikacje ASP.NET Core
Microsoft.Extensions.Logging jest używany domyślnie w aplikacjach ASP.NET Core. Wywoływanie AddDbContext lub AddDbContextPool sprawia, że program EF Core automatycznie używa konfiguracji rejestrowania skonfigurowanej za pośrednictwem zwykłego mechanizmu ASP.NET.
Inne typy aplikacji
Inne typy aplikacji mogą używać metody GenericHost , aby uzyskać te same wzorce iniekcji zależności, które są używane w ASP.NET Core. AddDbContext lub AddDbContextPool może być używany podobnie jak w aplikacjach ASP.NET Core.
Microsoft.Extensions.Logging można również używać dla aplikacji, które nie korzystają z wstrzykiwania zależności, jednak proste rejestrowanie może być łatwiejsze do skonfigurowania.
Microsoft.Extensions.Logging wymaga utworzenia obiektu LoggerFactory. Ta fabryka powinna być przechowywana jako wystąpienie statyczne/globalne w dowolnym miejscu i używana za każdym razem, gdy tworzony jest obiekt DbContext. Na przykład często przechowuje się fabrykę loggera jako właściwość statyczną w obiekcie DbContext.
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
To pojedyncze/globalne wystąpienie powinno być następnie zarejestrowane w EF Core na DbContextOptionsBuilder. Przykład:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Uzyskiwanie szczegółowych komunikatów
Wskazówka
Funkcja OnConfiguring jest nadal wywoływana, gdy jest używany element AddDbContext lub wystąpienie DbContextOptions jest przekazywane do konstruktora DbContext. Dzięki temu idealnie nadaje się do zastosowania konfiguracji kontekstu niezależnie od sposobu konstruowania obiektu DbContext.
Dane poufne
Domyślnie program EF Core nie będzie zawierać wartości żadnych danych w komunikatach o wyjątkach. Dzieje się tak, ponieważ takie dane mogą być poufne i mogą zostać ujawnione w użyciu produkcyjnym, jeśli nie obsłużymy wyjątku.
Jednak znajomość wartości danych, szczególnie w przypadku kluczy, może być bardzo przydatna podczas debugowania. Tę funkcję można włączyć w programie EF Core, wywołując polecenie EnableSensitiveDataLogging(). Przykład:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableSensitiveDataLogging();
Szczegółowe wyjątki zapytań
Ze względu na wydajność program EF Core nie opakowuje każdego wywołania w celu odczytania wartości od dostawcy bazy danych w bloku try-catch. Jednak czasami skutkuje to wyjątkami, które są trudne do zdiagnozowania, zwłaszcza gdy baza danych zwraca wartość "NULL", mimo że model tego nie dopuszcza.
Włączenie EnableDetailedErrors spowoduje, że EF wprowadzi te bloki try-catch, a tym samym zapewni bardziej szczegółowe komunikaty o błędach. Przykład:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
Konfiguracja określonych komunikatów
Interfejs API platformy EF Core ConfigureWarnings umożliwia aplikacjom zmianę tego, co się stanie po napotkaniu określonego zdarzenia. Może to służyć do:
- Zmienianie poziomu dziennika, na którym rejestrowane jest zdarzenie
- Pomiń rejestrowanie zdarzenia całkowicie
- Zgłaszanie wyjątku w przypadku wystąpienia zdarzenia
Zmiana poziomu dziennika dla zdarzenia
Czasami może być przydatne zmiana wstępnie zdefiniowanego poziomu dziennika dla zdarzenia. Na przykład może to służyć do promowania dwóch dodatkowych wydarzeń z LogLevel.Debug do LogLevel.Information.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(
b => b.Log(
(RelationalEventId.ConnectionOpened, LogLevel.Information),
(RelationalEventId.ConnectionClosed, LogLevel.Information)));
Wstrzymanie rejestrowania zdarzenia
W podobny sposób pojedyncze zdarzenie może zostać pominięte podczas rejestrowania. Jest to szczególnie przydatne w przypadku ignorowania ostrzeżenia, które zostało poddane przeglądowi i zrozumieniu. Przykład:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));
Zgłaszanie zdarzenia
Na koniec program EF Core można skonfigurować do zgłaszania wyjątków dla określonego zdarzenia. Jest to szczególnie przydatne w przypadku zmiany ostrzeżenia na błąd. (Rzeczywiście, był to pierwotny cel ConfigureWarnings metody, stąd nazwa). Na przykład:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));
Filtrowanie i inna konfiguracja
Aby uzyskać wskazówki dotyczące filtrowania dzienników i innych konfiguracji, zobacz Rejestrowanie na platformie .NET .
Zdarzenia rejestrowania w EF Core są zdefiniowane w jednym z:
- CoreEventId dla zdarzeń typowych dla wszystkich dostawców baz danych EF Core
- RelationalEventId dla zdarzeń wspólnych dla wszystkich dostawców relacyjnych baz danych
- Podobna klasa dla zdarzeń specyficznych dla bieżącego dostawcy bazy danych. Na przykład SqlServerEventId dla dostawcy programu SQL Server.
Te definicje zawierają identyfikatory zdarzeń, poziom dziennika i kategorię dla każdego zdarzenia, które są używane przez Microsoft.Extensions.Logging.