Mencatat semua kueri basis data di Asp.Net Boilerplate 4.3 .Net Core 2.1

Seringkali dalam proyek ini ada kesalahan yang tidak dapat dimengerti yang diperlukan untuk pencatatan maksimum semua permintaan ke Database. Artikel ini akan membantu mereka yang menulis (menggunakan server) salah satu proyek pertama mereka di Asp.Net Boilerplate .

Artikel ini ditulis untuk mereka yang baru mengenal teknologi Asp.Net Boilerplate yang telah mengalami kesalahan aneh terkait dengan Database. Saat menggunakan PostgreSQL, ini mungkin, misalnya, proyek pertama. Motivasi untuk menulis artikel adalah bahwa solusi untuk pertanyaan ini tidak begitu mudah ditemukan di Internet, bahkan dalam bahasa Inggris, belum lagi fakta bahwa solusi yang ditemukan tidak sepenuhnya menjawab semua pertanyaan tentang masalah ini.

Versi Produk: Asp.Net Boilerplate 4.3, .NET Core 2.1

Jika Anda menyelesaikan langkah-langkah ini : Di file log utama Anda, Anda akan melihat semua permintaan ke Database masuk.

Langkah 1


Anda harus membuat logger. Sudah ada logger internal yang dikonfigurasi pada platform Boilerplate. Ini bisa menjadi Log4Net sebagai standar. Tidak perlu melakukan manipulasi dengannya. Alih-alih, cukup membuat kelas logger yang Anda daftarkan sebagai pengolah semua pesan log dari Database.

Langkah 1.1


Project * .EntityFrameworkCore. Di sini kita perlu membuat 2 kelas. Di satu sisi, logger yang hanya akan melakukan satu hal adalah untuk mengeluarkan semua pesan dari database ke log sistem. Sebut saja MyLogger. Dan penyedia logger ini yang akan membuat MyLogger. Penyedia disebut MyLoggerProvider.

Kami membuat satu file dengan kode berikut (satu file untuk penyederhanaan, meskipun, tentu saja, setiap file harus memiliki satu kelas):

public class MyLoggerProvider : ILoggerProvider { private Castle.Core.Logging.ILogger _logger; public MyLoggerProvider(Castle.Core.Logging.ILogger logger) { _logger = logger; } public ILogger CreateLogger(string categoryName) { return new MyLogger(_logger); } public void Dispose() { } } public class MyLogger : ILogger { private Castle.Core.Logging.ILogger _logger; public MyLogger(Castle.Core.Logging.ILogger logger) { _logger = logger; } public IDisposable BeginScope<TState>(TState state) { return null; } public bool IsEnabled(LogLevel logLevel) { return true; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { if (IsEnabled(logLevel)) { var msg = formatter(state, exception); _logger.Info("DB-REQUEST: " + msg); } } } 

Jika Anda melihat lebih dekat, Anda dapat melihat bagaimana beberapa logger lain diteruskan ke MyLoggerProvider, dan kemudian ke MyLogger. Ternyata sudah yang ketiga! Intinya adalah bahwa yang ketiga ini adalah kelas dari tingkat infrastruktur logging, yang harus diperoleh dari isi perut Boilerplate dengan bantuan yang pesannya akan disimpan dalam log. Lihat di bawah.

Langkah 2


Dalam kerangka kerja proyek * .EntityFrameworkCore yang sama, buka file * DbContextConfigurer.cs dan buat perubahan berikut di kedua metode Konfigurasi ():

2.1) Tambahkan parameter loggerfactory dari tipe LoggerFactory

2.2) Tambahkan dua baris ke badan metode:

 builder.UseLoggerFactory(loggerFactory); builder.EnableSensitiveDataLogging(true); 

Arti UseLoggerFactory adalah untuk mengaktifkan penggunaan loggerFactory, yang diteruskan dalam parameter untuk masuk ke Database. Sangat penting untuk diingat bahwa di sini kita mengaktifkan pendataan basis data.

Arti EnableSensitiveDataLogging adalah untuk mengaktifkan pencatatan tidak hanya permintaan basis data, tetapi juga merekam semua data dalam kueri ini. Tanpa pengaturan ini, Anda tidak akan dapat melihat data dalam kueri - mereka akan digantikan oleh tanda tanya.

Langkah 3


Dalam kerangka proyek * .EntityFrameworkCore yang sama, kita pergi ke file * DbContextFactory.cs.

3.1) Tambahkan metode baru:

 private LoggerFactory GetDbLoggerFactory() { return new LoggerFactory(new[] { new MyLoggerProvider(NullLogger.Instance) }); } 

3.2) Dalam metode CreateDbContext ():
Karena Karena kami sebelumnya menambahkan parameter baru ke kedua Konfigurasi () implementasi, kesalahan harus ditampilkan di sini. Saatnya menentukan parameter baru ini - kami mendaftarkan GetDbLoggerFactory () dengan koma. Yaitu nilai parameter loggerFactory baru akan dikembalikan dengan metode baru dari klausa 3.1.

Langkah 4


Dalam kerangka proyek * .EntityFrameworkCore yang sama, kita pergi ke file * EntityFrameworkModule.cs.

4.1) Tambahkan metode baru:

 private LoggerFactory GetDbLoggerFactory() { return new LoggerFactory(new[] { new MyLoggerProvider(Logger) }); } 

4.2) Dalam metode PreInitialize ():

Karena Karena kami sebelumnya menambahkan parameter baru ke kedua Konfigurasi () implementasi, kesalahan juga harus ditampilkan di sini. Kami menetapkan parameter baru yang mirip dengan Bagian 3.2 - kami mendaftarkan GetDbLoggerFactory () dengan koma. Yaitu nilai parameter loggerFactory baru akan dikembalikan dengan metode baru dari klausul 4.1.

Hasil


Dalam file log utama (secara default Logs.txt) Anda akan melihat semua pertanyaan yang didahului oleh urutan karakter DB-REQUEST (dari sini Anda dapat mencari data dalam log).

Pemahaman umum tentang solusinya


Jadi, sekarang saya akan menjelaskan apa yang telah kami lakukan. Penjelasan diberikan di akhir artikel, karena seringkali pembaca tertarik untuk mulai melakukan sesuatu yang spesifik.

Di kelas * DbContextFactory, serta * EntityFrameworkModule, kami membuat LoggerFactory kami, dalam parameter yang kami tunjukkan MyLoggerProvider yang dibuat. Tetapi sebagai kelas infrastruktur yang akan secara langsung masuk dalam kasus pertama (* DbContextFactory), kami melewati NullLogger.Instance stub sehingga tidak ada entri. Dalam kasus kedua (* EntityFrameworkModule) kita melewati logger, yang sudah ada di modul-Abp. Ini adalah bidang Logger. Ini sudah diinisialisasi dan dapat dicatat. Dengan demikian, MyLogger kami akan dapat menulis ke file Logs.txt menggunakan kelas ini.

Logikanya keseluruhan adalah bahwa pabrik loggerFactory ini diinstal sebagai pabrik log untuk bekerja dengan Database. Segera setelah logger dibutuhkan, itu dibuat oleh pabrik. Dan ini adalah MyLogger kami, yang, pada gilirannya, mencatat semua yang datang ke Logs.txt (atau sumber yang dikonfigurasi untuk output dari log utama Anda).

Seperti yang Anda lihat, tidak semuanya begitu sederhana dan tingkat abstraksi terkadang membeku, terutama untuk pemula! Ajukan pertanyaan Anda di komentar.

Catatan:

- Solusinya dibuat untuk menyalakan logger, memahami apa kesalahannya dan mematikannya. Itu tidak dirancang untuk penggunaan jangka panjang.

Source: https://habr.com/ru/post/id444660/


All Articles