logo

بهترین ها همه در یک جا

مطالب آموزشی

لاگ کردن توسط Serilog و ذخیره در SQL و Seq

اشتراک گذاری :

لاگ کردن توسط Serilog و ذخیره در MS SQL و Seq  در دات نت 6

Serilog یکی از معروف ترین کتابخانه های Logging بر مبنای دات نت است و به راحتی با سیستم لاگینگ توکار دات نت یکپارچه میشود. آدرس سایت اصلی اون https://serilog.net است.

برای نصب برای Dot Net Core میتونید از طریق Nuget یا Command اقدام کنید.

Install-Package Serilog.AspNetCore

Serilog برای ذخیره سازی از پروایدرهای بسیار زیادی پشتیبانی میکنه که به اونها سینک (Sink) گفته میشه مثلا کنسول ، SQL Server ، Kibana ، Seq و ... که لیست کامل اونها رو میتونید اینجا ببینید. 

https://github.com/serilog/serilog/wiki/Provided-Sinks

برای استفاده از هر کدوم از اونها باید از طریق Nuget بسته مرتبط با اون ها رو نصب کنید . در ساده ترین حالت برای استفاده معمولا Console به صورت زیر نصب و استفاده میشه که البته ما از Console در این مقاله استفاده نمیکنیم و میتونید از اون صرف نظر کنید.

Install-Package Serilog.Sinks.Console

و در فایل Program.cs به صورت زیر رجیستر میشود.

builder.Host.UseSerilog((ctx, lc) => lc.WriteTo.Console())


استفاده از MS SQL Server



اما برای استفاده از SQL Server برای ذخیره سازی ، ابتدا یک دیتابیس جداگانه برای آن تعریف کنید، این کار سبب بهبود عملکرد برنامه شما میشود وگرنه اگر از دیتابیس فعلی خود هم استفاده کنید مشکلی وجود ندارد.

سپس در فایل appsetting.json در قسمت ConnectionStrings ، آدرس ConnectionString جدید خود را وارد کنید.

  "ConnectionStrings": {
    "DefaultConnection": "Server=.;initial catalog=MyMainDB;Integrated Security=true",
    "LogsConnection": "Server=.;initial catalog=MyLogsDB;Integrated Security=true"
  },

اکنون قبل از هر چیزی سینک مربوط به SQL Server رو نصب کنید.

Install-Package Serilog.Sinks.MSSqlServer

حالا در در فایل Program.cs به صورت زیر آن را رجیستر کنید.

builder.Host.UseSerilog((context, config) =>
{
    var connectionString = context.Configuration.GetConnectionString("LogsConnection");
    config.WriteTo.MSSqlServer(connectionString, new MSSqlServerSinkOptions() { TableName = "MyLogs", AutoCreateSqlTable = true }).MinimumLevel.Error();
});

نکته جالب در اینجا این است که میتونید نام Table رو خودتون تعیین کنید. همچنین در ادامه میتونید حداقل Lavel ای که لاگ شدن از آن شروع میشود را تعیین کنید. سطوح مختلف Log به صورت زیر است :

VerboseVerbose is the noisiest level, rarely (if ever) enabled for a production app.
Debug Debug is used for internal system events that are not necessarily observable from the outside, but useful when determining how something happened.
Information Information events describe things happening in the system that correspond to its responsibilities and functions. Generally these are the observable actions the system can perform.
Warning When service is degraded, endangered, or may be behaving outside of its expected parameters, Warning level events are used.
Error When functionality is unavailable or expectations broken, an Error event is used.
FatalThe most critical level, Fatal events demand immediate attention.


دقت کنید که اگر سطح پایینی برای لاگ کردن وقایع انتخاب کنید ، حجم پردازش و ذخیره سازی داده ها در برنامه زیاد میشود و میتواند موجب کندی سیستم شود ، به همین خاطر ما در اینجا Minimum Level را Error انتخاب کردیم. همچنین میتونید برای محیط های مختلف توسعه و دیباگ و پروداکشن و ... یا اعمال شرط سطوح مختلفی از لاگ اعمال کنید.

حالا برای تست یک پیام ساده را تست کنید.

  private readonly ILogger<TestController> _logger;
public TestController(ILogger<TestController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
try
{
int a = 10, b = 10;
int c = 1 / (a-b);
}
catch (Exception e)
{
_logger.LogError( e , "Error in index action!"));
}
...
}

برای اینکه سناریو کمی واقعی تر باشد. از یک try و catch استفاده کنید و یک Exception رو ذخیره کنید. مثلا اکشن رو به حالتی مثل زیر تغییر بدید.

  public IActionResult Index()
        {
            try
            {
                int a = 10, b = 10;
                int c = 1 / (a-b);
        }
         catch (Exception e)
            {
                _logger.LogError( e , "Error in index action!"));
        }
        ...
         }

استفاده از Seq


در قدم بعدی ممکنه شما بخواهید لاگ های ثبت شده رو به صورت ویژوالی ببینید و با SQL راحت نباشد. میتونید به جای SQL از یک پروایدر دیگر مثل Seq استفاده کنید که خودش هم کار ذخیره و هم کار نمایش رو انجام میده و یا اینکه دوست دارید هر دو را کنار هم داشته باشید.

ابتدا سینک آنرا به صورت زیر نصب کنید.

Install-Package Serilog.Sinks.Seq

خود Seq را برای ویندوز از آدرس زیر دریافت و نصب کنید.

https://docs.datalust.co/docs/getting-started

آدرس پیش فرض پنل بعد از نصب http://localhost:5341 خواهد بود.

سپس فایل Program.cs رو کمی تغییر بدید. اگر به صورت خیلی ساده و فقط از Seq در ساده ترین حالت بخواهید استفاده کنید مثل کد زیر عمل کنید.

builder.Host.UseSerilog((context, config) =>
{
    config.WriteTo.Seq("http://localhost:5341").MinimumLevel.Error();;
});

 و اگر میخواهید در کنار SQL از آن استفاده کنید و یا همچنین  میخواهید سطح لاگ کردن خطاها رو به صورت داینامیک از طریق پنل تغییر دهید، از کد زیر استفاده کنید، البته Api Key رو از پنل نصب شده باید بسازید و جایگذاری کنید.

builder.Host.UseSerilog((context, config) =>
{
    var levelSwitch = new LoggingLevelSwitch();
    var connectionString = context.Configuration.GetConnectionString("LogsConnection");
    config.WriteTo.MSSqlServer(connectionString, new MSSqlServerSinkOptions() { TableName = "ApiLogs", AutoCreateSqlTable = true } , null , null , LogEventLevel.Error);
    config.WriteTo.Seq("http://localhost:5341" , apiKey:"****" , controlLevelSwitch: levelSwitch).MinimumLevel.ControlledBy(levelSwitch);
});

برای استفاده از Serilog در ورژن های قدیم تر دات نت از این مقاله میتوانید استفاده کنید.


برنامه نویسی آموزش SQL Server
avatar

برنامه نویس و توسعه دهنده ارشد وب
کارشناس ارشد مدیریت فناوری اطلاعات