Menggunakan Microsoft.Extensions.Logging di EF Core
Microsoft.Extensions.Logging merupakan mekanisme pengelogan yang dapat diperluas dengan penyedia plug-in untuk banyak sistem pengelogan. Plug-in yang disediakan Microsoft (misalnya Microsoft.Extensions.Logging.Console) dan plug-in pihak ketiga (misalnya Serilog.Extensions.Logging) tersedia sebagai paket NuGet.
Entity Framework Core (EF Core) sepenuhnya terintegrasi dengan Microsoft.Extensions.Logging
. Namun, pertimbangkan untuk menggunakan pengelogan sederhana untuk cara yang lebih sederhana untuk mencatat, terutama untuk aplikasi yang tidak menggunakan injeksi dependensi.
Aplikasi ASP.NET Core
Microsoft.Extensions.Logging
digunakan secara default dalam aplikasi ASP.NET Core. Memanggil AddDbContext atau AddDbContextPool membuat EF Core secara otomatis menggunakan penyiapan pengelogan yang dikonfigurasi melalui mekanisme ASP.NET reguler.
Jenis aplikasi lainnya
Jenis aplikasi lain dapat menggunakan GenericHost untuk mendapatkan pola injeksi dependensi yang sama seperti yang digunakan dalam ASP.NET Core. AddDbContext atau AddDbContextPool kemudian dapat digunakan seperti dalam aplikasi ASP.NET Core.
Microsoft.Extensions.Logging
juga dapat digunakan untuk aplikasi yang tidak menggunakan injeksi dependensi, meskipun pengelogan sederhana dapat lebih mudah diatur.
Microsoft.Extensions.Logging
membutuhkan pembuatan LoggerFactory. Pabrik ini harus disimpan sebagai instans statis/global di suatu tempat dan digunakan setiap kali DbContext dibuat. Misalnya, umum untuk menyimpan pabrik pencatat sebagai properti statis di DbContext.
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
Instans singleton/global ini kemudian harus terdaftar di EF Core pada DbContextOptionsBuilder. Contohnya:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Mendapatkan pesan terperinci
Tip
OnConfiguring masih dipanggil ketika AddDbContext digunakan atau instans DbContextOptions diteruskan ke konstruktor DbContext. Ini menjadikannya tempat yang ideal untuk menerapkan konfigurasi konteks terlepas dari bagaimana DbContext dibangun.
Data sensitif
Secara default, EF Core tidak akan menyertakan nilai data apa pun dalam pesan pengecualian. Ini karena data tersebut mungkin bersifat rahasia, dan dapat diungkapkan dalam penggunaan produksi jika pengecualian tidak ditangani.
Namun, mengetahui nilai data, terutama untuk kunci, bisa sangat membantu saat men-debug. Ini dapat diaktifkan di EF Core dengan memanggil EnableSensitiveDataLogging(). Contohnya:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableSensitiveDataLogging();
Pengecualian kueri terperinci
Untuk alasan performa, EF Core tidak membungkus setiap panggilan untuk membaca nilai dari penyedia database dalam blok try-catch. Namun, ini terkadang menghasilkan pengecualian yang sulit didiagnosis, terutama ketika database mengembalikan NULL ketika tidak diizinkan oleh model.
Mengaktifkan EnableDetailedErrors akan menyebabkan EF memperkenalkan blok try-catch ini dan dengan demikian memberikan kesalahan yang lebih rinci. Contohnya:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
Konfigurasi untuk pesan tertentu
EF Core ConfigureWarnings API memungkinkan aplikasi untuk mengubah apa yang terjadi ketika peristiwa tertentu ditemui. Ini dapat digunakan untuk:
- Mengubah tingkat log tempat peristiwa dicatat
- Lewati pengelogan peristiwa sama sekali
- Melemparkan pengecualian saat peristiwa terjadi
Mengubah tingkat log untuk suatu peristiwa
Terkadang dapat berguna untuk mengubah tingkat log yang telah ditentukan sebelumnya untuk suatu peristiwa. Misalnya, ini dapat digunakan untuk mempromosikan dua peristiwa tambahan dari LogLevel.Debug
ke LogLevel.Information
:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(
b => b.Log(
(RelationalEventId.ConnectionOpened, LogLevel.Information),
(RelationalEventId.ConnectionClosed, LogLevel.Information)));
Menyembunyikan pengelogan peristiwa
Dengan cara yang sama, peristiwa individu dapat ditekan dari pengelogan. Ini sangat berguna untuk mengabaikan peringatan yang telah ditinjau dan dipahami. Contohnya:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));
Melemparkan untuk suatu peristiwa
Terakhir, EF Core dapat dikonfigurasi untuk dilemparkan untuk peristiwa tertentu. Ini sangat berguna untuk mengubah peringatan menjadi kesalahan. (Memang, ini adalah tujuan ConfigureWarnings
asli metode, oleh karena itu namanya.) Misalnya:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));
Pemfilteran dan konfigurasi lainnya
Lihat Pengelogan di .NET untuk panduan tentang pemfilteran log dan konfigurasi lainnya.
Peristiwa pengelogan EF Core didefinisikan dalam salah satu dari:
- CoreEventId untuk peristiwa yang umum untuk semua penyedia database EF Core
- RelationalEventId untuk peristiwa yang umum untuk semua penyedia database relasional
- Kelas serupa untuk peristiwa khusus untuk penyedia database saat ini. Misalnya, SqlServerEventId untuk penyedia SQL Server.
Definisi ini berisi ID peristiwa, tingkat log, dan kategori untuk setiap peristiwa, seperti yang digunakan oleh Microsoft.Extensions.Logging
.