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.Loggingtamamen 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. Çağırma AddDbContext veya AddDbContextPool EF Core'un normal ASP.NET mekanizması aracılığıyla yapılandırılan günlük kurulumunu otomatik olarak kullanmasını sağlar.

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 bir yerde statik/genel örnek olarak depolanmalıdır ve dbContext her oluşturulduğunda kullanılmalıdır. Örneğin, günlükçü fabrikasını DbContext üzerinde statik bir özellik olarak depolamak yaygın bir durumdur.

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

Bu tekil/genel örnek üzerinde EF Core'a DbContextOptionsBuilderkaydedilmelidir. Örnek:

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

Bahşiş

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. Bu, çağrısıyla EnableSensitiveDataLogging()EF Core'da etkinleştirilebilir. Örnek:

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, bu bazen özellikle veritabanı model tarafından izin verilmediğinde NULL döndürdüğünde tanılaması zor özel durumlarla sonuçlanıyor.

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. Örnek:

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 günlüğe kaydedildiği günlük düzeyini değiştirme
  • Olayı günlüğe kaydetmeyi tamamen atlayın
  • Olay gerçekleştiğinde özel durum oluşturma

Olay için günlük düzeyini değiştirme

Bazen bir olay için önceden tanımlanmış günlük düzeyini değiştirmek yararlı olabilir. Örneğin, bu iki ek olayı olarak LogLevel.Debug yükseltmek için LogLevel.Informationkullanı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. Örnek:

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

Olay için oluşturma

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.) Örneğin:

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

Filtreleme ve diğer yapılandırma

Günlük filtreleme ve diğer yapılandırma hakkında yönergeler için bkz . .NET'te oturum açma.

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 için
  • 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 tarafından Microsoft.Extensions.Loggingkullanılan her olayın olay kimliklerini, günlük düzeyini ve kategorisini içerir.