تسجيل جميع استعلامات قاعدة البيانات في Asp.Net Boilerplate 4.3 .Net Core 2.1

غالبًا ما يكون هناك خطأ غير مفهوم في المشروع يكون فيه الحد الأقصى لتسجيل جميع الاستعلامات إلى قاعدة البيانات ضروريًا . ستساعد المقالة أولئك الذين يكتبون (ينشرون على الخادم) على تنفيذ أحد مشاريعهم الأولى على Asp.Net Boilerplate .

هذه المقالة مكتوبة لأولئك الجدد على تقنية Asp.Net Boilerplate الذين واجهوا أي خطأ غريب يتعلق بقاعدة البيانات. عند استخدام PostgreSQL ، قد يكون هذا ، على سبيل المثال ، المشروع الأول. كان الدافع وراء كتابة المقال هو أن حل هذا السؤال ليس من السهل العثور عليه على الإنترنت ، حتى باللغة الإنجليزية ، ناهيك عن حقيقة أن الحلول الموجودة لا تجيب بالكامل على جميع الأسئلة حول هذه المشكلة.

إصدار المنتج: Asp.Net Boilerplate 4.3 ، .NET Core 2.1

إذا قمت بإكمال هذه الخطوات : في ملف السجل الرئيسي الخاص بك ، سترى جميع الطلبات إلى قاعدة البيانات بتسجيل الدخول.

الخطوة 1


يجب عليك إنشاء مسجل. يوجد بالفعل مسجل داخلي مكون على منصة Boilerplate. يمكن أن يكون Log4Net كمعيار. ليست هناك حاجة لإجراء أي تلاعب معه. بدلاً من ذلك ، يكفي إنشاء فئة تسجيل تقوم بتسجيلها كمعالج لجميع رسائل السجل من قاعدة البيانات.

الخطوة 1.1


Project * .EntityFrameworkCore. نحن هنا بحاجة إلى إنشاء 2 فصول. من ناحية ، فإن المسجل الذي سيقوم بشيء واحد فقط هو إخراج جميع الرسائل من قاعدة البيانات إلى سجل النظام. دعنا نسميها MyLogger. ومزود هذا المسجل الذي سيخلق MyLogger. يسمى الموفر MyLoggerProvider.

نقوم بإنشاء ملف واحد بالشفرة التالية (ملف واحد للتبسيط ، على الرغم من أنه يجب أن يكون لكل ملف فئة واحدة بالطبع):

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); } } } 

إذا نظرت عن كثب ، يمكنك أن ترى كيف يتم إعادة توجيه بعض المسجل إلى MyLoggerProvider ، ثم إلى MyLogger. اتضح بالفعل الثالث! خلاصة القول هي أن هذا المستوى الثالث هو فئة مستوى البنية التحتية للتسجيل ، والتي يجب الحصول عليها من أحشاء Boilerplate بمساعدة الرسائل التي سيتم حفظها في السجل. انظر أدناه.

الخطوة 2


ضمن إطار المشروع * .EntityFrameworkCore نفسه ، انتقل إلى ملف * DbContextConfigurer.cs وقم بإجراء التغييرات التالية في كلتا الطريقتين Configure ():

2.1) إضافة معلمة loggerfactory من نوع LoggerFactory

2.2) إضافة سطرين إلى طريقة الجسم:

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

معنى UseLoggerFactory هو تمكين استخدام loggerFactory ، والذي يتم تمريره في معلمات تسجيل قاعدة البيانات. من المهم للغاية أن نتذكر أننا هنا نقوم بتمكين تسجيل قاعدة البيانات.

معنى EnableSensitiveDataLogging هو تمكين تسجيل ليس فقط استعلامات قاعدة البيانات ، ولكن أيضًا تسجيل جميع البيانات في هذه الاستعلامات. بدون هذا الإعداد ، لن تتمكن من رؤية البيانات في الاستعلامات - سيتم استبدالها بعلامات استفهام.

الخطوة 3


ضمن إطار مشروع * .EntityFrameworkCore نفسه ، نذهب إلى ملف * DbContextFactory.cs.

3.1) إضافة طريقة جديدة:

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

3.2) في الأسلوب CreateDbContext ():
لأن نظرًا لأننا سبق أن أضفنا معلمة جديدة إلى كل من تطبيقي Configure () ، فيجب عرض خطأ هنا. لقد حان الوقت لتحديد هذه المعلمة الجديدة - نسجل GetDbLoggerFactory () بفاصلة. أي يجب إرجاع قيمة المعلمة loggerFactory الجديدة بواسطة الطريقة الجديدة من الفقرة 3.1.

الخطوة 4


في إطار مشروع * .EntityFrameworkCore نفسه ، نذهب إلى ملف * EntityFrameworkModule.cs.

4.1) إضافة طريقة جديدة:

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

4.2) في الأسلوب PreInitialize ():

لأن نظرًا لأننا سبق أن أضفنا معلمة جديدة إلى كل من تطبيقات Configure () ، فيجب أيضًا عرض خطأ هنا. نحدد معلمة جديدة تشبه القسم 3.2 - نسجل GetDbLoggerFactory () بفاصلة. أي يجب إرجاع قيمة المعلمة loggerFactory الجديدة بواسطة الطريقة الجديدة من الفقرة 4.1.

يؤدي


في ملف السجل الرئيسي (افتراضيًا.

الفهم العام للحل


والآن ، سأشرح ما فعلناه. ويرد شرح في نهاية المقال ، لأنه غالبًا ما يهتم القراء بالبدء في فعل شيء محدد بالفعل.

في الفئة * DbContextFactory ، وكذلك * EntityFrameworkModule ، نقوم بإنشاء LoggerFactory لدينا ، في المعلمات التي نشير إلى MyLoggerProvider الذي تم إنشاؤه. ولكن كفئة بنية أساسية تسجّل مباشرةً في الحالة الأولى (* DbContextFactory) ، نمرر كعب الروتين NullLogger.Instance بحيث لا توجد إدخالات. في الحالة الثانية (* EntityFrameworkModule) نمر المسجل ، وهو بالفعل في وحدة Abp. هذا هو حقل المسجل. تمت تهيئتها بالفعل ويمكن تسجيلها معها. وفقًا لذلك ، سيكون بإمكان MyLogger الكتابة إلى ملف Logs.txt باستخدام هذه الفئة.

المنطق كله هو أن مصنع loggerFactory مثبت كمصنع سجل للعمل مع قاعدة البيانات. بمجرد الحاجة إلى المسجل ، يتم إنشاؤه بواسطة المصنع. وهذا هو MyLogger الخاص بنا ، والذي بدوره يسجل كل شيء يأتي إلى Logs.txt (أو المصدر الذي تم تكوين إخراج سجلاتك الرئيسية).

كما ترون ، ليس كل شيء في غاية البساطة ومستويات التجريدية تتجمد في بعض الأحيان ، خاصة بالنسبة للمبتدئين! اطرح أسئلتك في التعليقات.

ملاحظة:

- تم إنشاء الحل من أجل تشغيل المسجل وفهم ماهية الخطأ وإيقاف تشغيله. ليست مصممة للاستخدام طويل الأجل.

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


All Articles