EF Core'da Microsoft.Extensions.Logging Kullanma

Microsoft.Extensions.Logging , birçok yaygın günlük sistemi için eklenti sağlayıcılarıyla genişletilebilir bir günlük mekanizmasıdır. Hem Microsoft tarafından sağlanan eklentiler (örneğin , Microsoft.Extensions.Logging.Console) hem de üçüncü taraf eklentileri (ör. Serilog.Extensions.Logging) NuGet paketleri olarak kullanılabilir.

Entity Framework Core (EF Core) ile Microsoft.Extensions.Logging tamamen tümleşir. Ancak, özellikle bağımlılık ekleme kullanmayan uygulamalar için daha basit bir günlük kaydı yöntemi kullanmayı göz önünde bulundurun.

ASP.NET Core uygulamaları

Microsoft.Extensions.Logging varsayılan olarak ASP.NET Core uygulamalarında kullanılır. AddDbContext veya AddDbContextPool çağrılması, EF Core'un normal ASP.NET mekanizması aracılığıyla yapılandırılan log kurulumunu otomatik olarak kullanmasına neden olur.

Diğer uygulama türleri

Diğer uygulama türleri GenericHost kullanarak ASP.NET Core'da kullanılan bağımlılık ekleme desenlerini alabilir. AddDbContext veya AddDbContextPool ASP.NET Core uygulamalarında olduğu gibi kullanılabilir.

Microsoft.Extensions.Logging bağımlılık ekleme kullanmayan uygulamalar için de kullanılabilir, ancak basit günlükleri ayarlamak daha kolay olabilir.

Microsoft.Extensions.Logging bir LoggerFactoryoluşturulmasını gerektirir. Bu fabrika, belirli bir yerde statik/genel bir örnek olarak depolanmalıdır ve her DbContext oluşturulduğunda kullanılmalıdır. Örneğin, kayıt fabrikasının DbContext’te statik özellik olarak depolanması yaygın bir durumdur.

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

Bu tekil/küresel örnek, DbContextOptionsBuilder üzerinde EF Core ile kaydedilmelidir. Örneğin:

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

Ayrıntılı iletiler alınıyor

Tavsiye

AddDbContext kullanıldığında veya DbContextOptions örneği DbContext oluşturucusna geçirildiğinde OnConfiguring hala çağrılır. Bu, DbContext'in nasıl yapılandırıldığından bağımsız olarak bağlam yapılandırmasını uygulamak için ideal bir yer olmasını sağlar.

Hassas veriler

Varsayılan olarak, EF Core özel durum iletilerine hiçbir verinin değerini içermez. Bunun nedeni, bu tür verilerin gizli olması ve bir özel durum işlenmezse üretim kullanımında ortaya çıkarılabilmesidir.

Ancak, özellikle anahtarlar için veri değerlerini bilmek hata ayıklama sırasında çok yararlı olabilir. EF Core'da bu, EnableSensitiveDataLogging() çağrısı ile etkinleştirilebilir. Örneğin:

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

Ayrıntılı sorgu özel durumları

Performans nedenleriyle EF Core, bir try-catch bloğundaki veritabanı sağlayıcısından bir değeri okumak için yapılan her çağrıyı sarmalamaz. Ancak bazen, özellikle model tarafından izin verilmediği halde veritabanının NULL döndürmesi durumunda, tanımlaması zor olan özel durumlarla sonuçlanabiliyor.

Bu ayarın açılması EnableDetailedErrors EF'in bu try-catch bloklarını tanıtmasına ve böylece daha ayrıntılı hatalar sağlamasına neden olur. Örneğin:

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

Belirli iletiler için yapılandırma

EF Core ConfigureWarnings API'si, uygulamaların belirli bir olayla karşılaşıldığında ne olacağını değiştirmesine olanak tanır. Bu, aşağıdakiler için kullanılabilir:

  • Olayın kaydedildiği günlüğün seviyesini değiştirme
  • Olayı günlüğe kaydetmeyi tamamen atlayın
  • Olay gerçekleştiğinde özel durum oluşturma

Olayın günlük kaydı seviyesini değiştirme

Bazen bir olay için önden belirlenmiş günlük seviyesini değiştirmek yararlı olabilir. Örneğin, bu LogLevel.Debug ile LogLevel.Information arasında iki ek etkinliği tanıtmak için kullanılabilir:

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

Bir olayın günlüğe kaydedilmesini gizleme

Benzer şekilde, tek bir olay günlük kaydından gizlenebilir. Bu, özellikle gözden geçirilmiş ve anlaşılmış bir uyarıyı yoksaymak için kullanışlıdır. Örneğin:

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

Bir olayı tetikleme

Son olarak, EF Core belirli bir olay için oluşturacak şekilde yapılandırılabilir. Bu, özellikle uyarıyı hataya dönüştürmede kullanışlıdır. (Aslında, yöntemin ConfigureWarnings özgün amacı budur, dolayısıyla addır.) Mesela:

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

Filtreleme ve diğer yapılandırma

Günlüğün filtrelenmesi ve diğer yapılandırmalarla ilgili yönergeler için .NET'te Kayıt bölümüne bakın.

EF Core günlük olayları şunlardan birinde tanımlanır:

  • CoreEventId tüm EF Core veritabanı sağlayıcıları için ortak olaylar
  • RelationalEventId tüm ilişkisel veritabanı sağlayıcılarının ortak olduğu olaylar için
  • Geçerli veritabanı sağlayıcısına özgü olaylar için benzer bir sınıf. Örneğin, SqlServerEventId SQL Server sağlayıcısı için.

Bu tanımlar, Microsoft.Extensions.Logging tarafından kullanılan her olayın olay kimliklerini, günlük düzeyini ve kategorisini içerir.