Lời nói đầu!
- Là một developer mk không thể phủ nhận rằng trong một hệ thống mà thiếu logging thì việc debug, sửa lỗi nó khó khăn ntn.
- Logging giúp chúng ta dễ dàng theo dõi quá trình hệ thống xử lý tác vụ, khắc phục sự cố hoặc gỡ lỗi.
- Một trong những cách log đơn giản mà hiệu quả mk hay sử dụng đó là dùng Serilog.
- Bài viết này mk sẽ giới thiệu cách sử dụng logging using Serilog trong API ASP.NET Core 3.1 nhé.
1. Tạo project
- Đặt tên dự án là TestLogging và chọn ASP.NET Core 3.1 API template
2. Add Serilog packages
- Các bạn thêm nhưng packages dưới đây vào project nhé
<ItemGroup>
<PackageReference Include="Sentry.AspNetCore" Version="3.3.4" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.1.3" />
<PackageReference Include="Serilog.Exceptions" Version="6.1.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
</ItemGroup>
3. Configure Serilog in Program.cs
- Thêm đoạn code bên dưới vào class Program.cs
- Đảm bảo rằng bạn thêm
UseConfiguration()
vàUserSerilog()
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Exceptions;
using System;
using System.IO;
namespace API.Serilog
{
public class Program
{
public static IConfiguration Configuration { get; private set; }
public static void Main(string[] args)
{
// Build Configuration
Configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", true,
true)
.AddCommandLine(args)
.AddEnvironmentVariables()
.Build();
// Configure serilog
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext()
.Enrich.WithExceptionDetails()
.Enrich.WithMachineName()
.CreateLogger();
try
{
Log.Information("Starting up...");
CreateHostBuilder(args).Build().Run();
Log.Information("Shutting down...");
}
catch (Exception ex)
{
Log.Fatal(ex, "Api host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseConfiguration(Configuration)
.UseSerilog();
});
}
}
4. Add Serilog settings to appsettings.json
- Thêm đoạn json bên dưới vào file appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.RollingFile"
],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Error",
"System": "Error",
"Microsoft.EntityFrameworkCore.Database.Command": "Error"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "C:\\Logs\\API.Serilog\\log-api-serilog-{Date}.txt",
"retainedFileCountLimit": 14,
"shared": true,
"buffered": false,
"flushToDiskInterval": "00:00:10",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level}] {MachineName} ({ThreadId}) <{SourceContext}> {Message}{NewLine}{Exception}"
}
},
{
"Name": "Console",
"Args": {
"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level}] {MachineName} ({ThreadId}) <{SourceContext}> {Message}{NewLine}{Exception}"
}
}
]
}
}
5. Add Logging to where you need
-
Tới bước này thì chúng ta đã có một công cụ ghi log khá hoàn chỉnh
-
Chúng ta có thể log theo các cấp độ sau
-
Log.Verbose()
-
Log.Debug() các thông tin debug sẽ được log
-
Log.Information() các thông tin về luồng làm việc của chương trình sẽ được log.
-
Log.Warning() các thông tin cảnh báo của chương trình sẽ được log.
-
Log.Error() các lỗi khi chạy chương trình sẽ được log nếu chúng ta sử dụng cấp độ này.
-
Log.Fatal() cấp độ này sẽ log các lỗi nghiêm trọng xảy ra trong chương trình, có thể làm cho chương trình không sử dụng được nữa.
-
Ví dụ ở đây mk thêm đoạn
Log.Information
trongWeatherForecastController
Log.Information($"GET WeatherForecast called at {DateTime.Now}");
6. Test run application
- Ở trong file
appsettings.json
thì chúng ra đang config pathFormat của log làpathFormat": "C:\\Logs\\API.Serilog\\log-api-serilog-{Date}.txt"
- Chúng ta mở file theo đường dẫn và xem kết quả
- Kết quả
[2021-05-22 21:37:57.280] [Information] B122247-PC () <> Starting up...
[2021-05-22 21:37:59.497] [Information] B122247-PC () <> GET WeatherForecast called at 22/05/2021 9:37:59 PM