مشخصات مقاله
-
1273
-
0.0
-
3863
-
0
-
0
آموزش ساختار Logging در ASP.NET Core 2
ساختار Logging در ASP.NET Core 2.
مشکل
نحوه کار با structured logging در ASP.NET Core و Serilog
راه حل
برنامه را از مقاله ای با موضوع (ASP.NET CORE 2.0 LOGGING) است آغاز کنید و Nuget Package های زیر را نصب کنید:
- Serilog.AspNetCore
- Serilog.Sinks.Literate
- Serilog.Sinks.Seq
در فایل Program.cs ، Serilog را با استفاده از کلاس LoggerConfiguration پیکربندی کنید و یک نمونه از ILogger (که توسط CreateLogger بازگردانده شده است) در کلاس Serilog’s static Log ذخیره شود.
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.LiterateConsole()
.CreateLogger();
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup< Startup >()
.UseSerilog()
.Build();
استفاده از ILogger همان فرایند است که در مقاله قبلی ما شرح داده شده است، با این حال، با Serilog می توانیم ورود به سیستم را انجام دهیم.
public async Task Invoke(HttpContext context)
{
var message = new
{
GreetingTo = "James Bond",
GreetingTime = "Morning",
GreetingType = "Good"
};
this.logger.LogInformation("Inoke executing {@message}", message);
await context.Response.WriteAsync("Hello Logging!");
this.logger.LogInformation(
"Inoke executed by {developer} at {time}", "Tahir", DateTime.Now);
}
برنامه در حال اجرا ،پیام ها را در پنجره Console نشان میدهد.
مباحثه
Structured logging یک تکنیک است که semantic information را به عنوان بخشی از پیام های ورودی(messages being logged) وارد کند.
Serilog از قالب message استفاده می کند و شبیه به string.Format () در دات نت است.
چند جنبه جالب از template syntax عبارتند از :
- از {} برای تعریف property names ها استفاده کنید برای نمونه {developer} در مثال بالا. این ها به عنوان metadata ذخیره می شوند و می توانند با استفاده از ذخیره سازی داده های ساخت یافته (مانند Seq، Azure) مورد استفاده قرار گیرند.
- با استفاده از @ ساختار object حفظ می شود برای نمونه anonymous object مرتب شده(serialized) در JSON.
Enrichers
در Serilog، enrichers برای اتصال اطلاعات به هر رویداد ورودی استفاده می شود که می تواند با ذخیره سازی داده های ساخت یافته (به عنوان مثال Seq، Azure) برای viewing و filtering مورد استفاده قرار گیرد.
یک راه ساده برای انجام این کار ، هنگام پیکربندی Serilog ، از (.Enrich.WithProperty()) استفاده کنیم.
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("ApiVersion", "1.2.5000")
.WriteTo.LiterateConsole()
.CreateLogger();
Context
همانطور که در پست قبلی دیده ایم، یک دسته(category) را می توان به logged messages متصل کرد، که به طور معمول نام کامل کلاس است. این اطلاعات را می توان با ذخیره سازی داده های ساخت یافته (به عنوان مثال Seq، Azure) استفاده کرد. Serilog این مکانیزم را با اتصال متنی از طریق متد ForContext () انجام می دهد.
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("ApiVersion", "1.2.5000")
.WriteTo.LiterateConsole()
.CreateLogger()
.ForContext< HelloLoggingMiddleware >();
Sinks
Sinks در Serilog اشاره به مقصد log messages دارد برا ی نمونه: file، database یا console (در مثال ما).
من از Seq بعنوان مثال sink استفاده خواهم کرد تا نشان دهم که چگونه تمام متادیتایی (metadata) که ما اضافه کرده ایم در یک structured storage موجود است.
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("ApiVersion", "1.2.5000")
.WriteTo.LiterateConsole()
.WriteTo.Seq("http://localhost:5341")
.CreateLogger()
.ForContext< HelloLoggingMiddleware >();
توجه کنید که داده های ما توسط enricher، context و custom object اضافه شده و به عنوان جفت key/ value به نظر می رسد. اکنون می توانید برای فیلتر کردن داده ها و ایجاد dashboards در Seq استفاده کنید.
می توانید Source Code این مقاله را از لنیک زیر دانلود کنید.