ایجاد یک ثبت کنندهی وقایع EF Core
مرحلهی اول مشاهدهی خروجیهای نهایی EF Core، پیاده سازی اینترفیس ILoggerProvider است که در آن قرار است وهلهی از نوع ILogger بازگشت داده شود. به همین جهت یک کلاس تو در توی خصوصی را در اینجا مشاهده میکنید که اینترفیس ILogger را نیز پیاده سازی کردهاست:
using System; using Microsoft.Extensions.Logging; namespace Tests { public class MyLoggerProvider : ILoggerProvider { public ILogger CreateLogger(string categoryName) { return new MyLogger(); } public void Dispose() { } private class MyLogger : ILogger { public bool IsEnabled(LogLevel logLevel) { return true; } public void Log<TState>( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { //File.AppendAllText(@"C:\temp\log.txt", formatter(state, exception)); Console.WriteLine(""); Console.WriteLine(formatter(state, exception)); } public IDisposable BeginScope<TState>(TState state) { return null; } } } }
در متد Log:
- پارامتر logLevel، سطح اهمیت اطلاعات رسیده را به همراه دارد. برای مثال اطلاعات است یا خطا؟
برای مثال شاید نیاز به ذخیره سازی اطلاعاتی با سطحهای بحرانی، خطا و یا اخطار در یک بانک اطلاعاتی وجود داشته باشد:
if (logLevel == LogLevel.Critical || logLevel == LogLevel.Error || logLevel == LogLevel.Warning)
- state: میتواند هر نوع شیءایی، حاوی اطلاعات وضعیت رخداد رسیده باشد.
- exception: بیانگر استثنای احتمالی رخ داده است.
- formatter: کار آن تولید یک رشتهی قابل خواندن، توسط اطلاعات حالت و استثناء است.
معرفی Logger تهیه شده به برنامه
پس از تهیهی Logger فوق، جهت معرفی آن به یک برنامهی کنسول، میتوان به صورت ذیل عمل کرد:
using (var db = new MyContext()) { var loggerFactory = (ILoggerFactory)db.GetInfrastructure().GetService(typeof(ILoggerFactory)); loggerFactory.AddProvider(new MyLoggerProvider()); }
در برنامههای ASP.NET Core، کار معرفی MyLoggerProvider در متد Configure کلاس آغازین برنامه انجام میشود:
public void Configure(ILoggerFactory loggerFactory) { loggerFactory.AddProvider(new MyLoggerProvider());
اختصاصی سازی ثبت وقایع رسیده
کلاس MyLoggerProvider، هر نوع اطلاعات داخلی EF Core را نیز لاگ میکند. اگر هدف صرفا بررسی خروجی SQL نهایی تولیدی است، میتوان در متد ذیل:
public ILogger CreateLogger(string categoryName)
برای این منظور، ابتدای Logger تهیه شده چنین شکلی را پیدا میکند:
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging; using System.Linq; using System; namespace Tests { public class MyLoggerProvider : ILoggerProvider { private static readonly string[] _categories = { typeof(RelationalCommandBuilderFactory).FullName, typeof(SqlServerConnection).FullName }; public ILogger CreateLogger(string categoryName) { if (_categories.Contains(categoryName)) { return new MyLogger(); } return NullLogger.Instance; }