اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
چهار دقیقه
Application Insights راهکار ارائه شده توسط Microsoft است که در سه بخش به ما کمک میکند تا سیستم لاگ مؤثر و کارآمدی داشته باشیم:
۱- متدهای پایه Log که به صورت دستی فراخوانی میشوند، مانند TrackEvent برای ثبت یک رویداد بیزینسی که این متدها فراتر از متدهای معمول loggerهای متداول هستند.
۲- به صورت خودکار، Application Insights خطاهای سیستم را لاگ نموده و همچنین در زمان کار کردن با Http Client، دیتابیس و سایر Dependencyها، میزان طول کشیدن آنها را به همراه آدرس Request یا متن Sql Command و سایر اطلاعات مفید را نیز ذخیره میکند که این خود منجر به جمع شدن دیتایی بسیار ارزشمند در سیستم میشود.
البته اگر یک Dependency به صورت خودکار شناسایی نشود، مانند Redis، شما میتوانید خودتان با متد TrackDependency اطلاعات آنرا به AppInsights بدهید.
۳- داشبورد App Insights در Azure این امکان را میدهد که به سریعترین شکل ممکن در لاگها جستجو نمود و برای مثال تمامی کارهای انجام شده توسط یک کاربر خاص را به صورت یکجا مشاهده و بررسی کرد.
فرضا اگر کاربر درخواست گرفتن خروجی Excel از لیست محصولات را داشته و این ۱ ثانیه طول کشیده، چقدر آن در انتظار دیتابیس بوده و ...
به علاوه از Power BI نیز میتوانید برای بیرون کشیدن نکات مهم استفاده کنید.
البته شاید App Insights برای کسانی که Azure Account نداشته باشند، مناسب به نظر نرسد، ولی اگر راهکاری برای ذخیره سازی On-Premise اطلاعات لاگ شده وجود داشته باشد چه؟ مثلا اطلاعات آن را در Elastic موجود در سرورهای شرکت، داخل ایران ذخیره نمود، بدون الزام به اینکه حتی آن سرور دسترسی به اینترنت داشته باشد.
بله، این امکان وجود دارد و با کمک Microsoft Diagnostics EventFlow میتوان اطلاعات App Insights را در هر جایی از جمله Elastic ذخیره نمود و بدین طریق از عمده مزایای App Insights بدون داشتن Azure Account بهره مند شد.
برای این منظور به شکل زیر عمل کنید: (آموزش برای ASP.NET Core 3.1 بوده، ولی برای سایر پروژهها نیز قابل استفاده است)
۱- ابتدا Application Insights را به پروژه خود اضافه کنید.بدین منظور لازم است Packageهای Microsoft.Extensions.Logging.ApplicationInsights و Microsoft.ApplicationInsights.AspNetCore را نصب کنید.
۲- در Program.cs بعد از
Host.CreateDefaultBuilder(args)
.ConfigureLogging(loggingBuilder => { loggingBuilder.ClearProviders(); loggingBuilder.AddApplicationInsights(); })
۳- اگر جایی قصد لاگ کردن یک Event را دارید، یا در مثال استفاده از Redis میخواهید اطلاعات زمان طول کشیدن رفت و برگشت به Redis را لاگ کنید یا یک try/catch دارید که در catch آن خطا را مجدد throw نمیکنید، ولی قصد لاگ کردن exception را دارید، ابتدا TelemetryClient را inject نموده و از متدهای آن مانند TrackException استفاده کنید.
توجه داشته باشید که اگر از ILogger ارائه شده توسط MS.Ext.Logging استفاده کنید نیز کار خواهد کرد.
۴- پکیج Microsoft.Diagnostics.EventFlow.Inputs.ApplicationInsights را در پروژه نصب کنید و سپس از بین Outputهای معرفی شده نیز یکی را انتخاب و پکیج آن را نیز نصب کنید. شما میتوانید دیتایی را که AppInsights به صورت خودکار جمع نموده را + دیتای ارائه شده توسط خودتان را به Elastic، Splunk و ... بفرستید.
ما در این مثال برای سادگی Std Out - Console Output را انتخاب میکنیم و پکیج Microsoft.Diagnostics.EventFlow.Outputs.StdOutput را نصب میکنیم.
۵- فایل eventFlowConfig.json را به پروژه اضافه کنید و موارد زیر را در آن قرار دهید:
{ "inputs": [ { "type": "ApplicationInsights" } ], "outputs": [ { "type": "StdOutput" // console output } ], "schemaVersion": "2016-08-11" }
۶- در Program.cs متد Main را به شکل زیر در بیاورید:
using (var pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json")) { CreateHostBuilder(args, pipeline) .Build() .Run(); }
public static IHostBuilder CreateHostBuilder(string[] args, DiagnosticPipeline pipeline) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(services => services.AddSingleton<ITelemetryProcessorFactory>(sp => new EventFlowTelemetryProcessorFactory(pipeline)))
.ConfigureLogging(logginBuilder =>
{
logginBuilder.ClearProviders();
loggingBuilder.AddApplicationInsights();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
همه چیز آماده است. هم اکنون اگر Azure Account داشته باشید، میتوانید با دادن instrumentationKey در appsetting.json از داشبورد فوق العاده ApplicationInsights استفاده کنید و اگر نه هم در سرورهای داخلی خودتان Splunk و ... را راه اندازی و در فایل eventFlowConfig.json، در قسمت outputs، اطلاعات آدرس آنها را بدهید و لاگهای مفصل و کاربردی ای که به صورت خودکار جمع آوری شده را به همراه اطلاعاتی که خودتان دستی ارائه کرده اید، یکجا تحویل بگیرید.
لینک پروژه در GitHub که حاوی مثال Elastic است.