Trong bài viết này, chúng ta sẽ tìm hiểu cách thực hiện ghi log có cấu trúc bằng Serilog trong asp.net core 7.0.
Logging là một phần thiết yếu của một ứng dụng. Nó giúp chúng ta theo dõi ứng dụng và thậm chí giúp chúng ta tìm ra nguyên nhân root cause sau khi triển khai ứng dụng lên production.
Setup
Cài đặt package
Install-Package Serilog.AspNetCore
Mở file Program.cs, giả sử chúng ta update như sau:
using Serilog;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("Starting web host");
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Host.UseSerilog();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
Bấm F5 chạy, chúng ta sẽ có kết quả như sau:
[23:57:48 INF] User profile is available. Using 'C:\Users\anbin\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
[23:57:48 INF] Now listening on: https://localhost:7295
[23:57:48 INF] Now listening on: http://localhost:5295
[23:57:48 INF] Application started. Press Ctrl+C to shut down.
[23:57:48 INF] Hosting environment: Development
...
Trường hợp bạn muốn hiển thị dưới dạng JSON
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
Kết quả
{"Timestamp":"2023-08-03T23:59:45.6362115+07:00","Level":"Information","MessageTemplate":"User profile is available. Using '{FullName}' as key repository and Windows DPAPI to encrypt keys at rest.","Properties":{"FullName":"C:\\Users\\anbin\\AppData\\Local\\ASP.NET\\DataProtection-Keys","EventId":{"Id":63,"Name":"UsingProfileAsKeyRepositoryWithDPAPI"},"SourceContext":"Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager"}}
{"Timestamp":"2023-08-03T23:59:45.7514811+07:00","Level":"Information","MessageTemplate":"Now listening on: {address}","Properties":{"address":"https://localhost:7295","EventId":{"Id":14,"Name":"ListeningOnAddress"},"SourceContext":"Microsoft.Hosting.Lifetime"}}
{"Timestamp":"2023-08-03T23:59:45.7516784+07:00","Level":"Information","MessageTemplate":"Now listening on: {address}","Properties":{"address":"http://localhost:5295","EventId":{"Id":14,"Name":"ListeningOnAddress"},"SourceContext":"Microsoft.Hosting.Lifetime"}}
{"Timestamp":"2023-08-03T23:59:45.7527722+07:00","Level":"Information","MessageTemplate":"Application started. Press Ctrl+C to shut down.","Properties":{"SourceContext":"Microsoft.Hosting.Lifetime"}}
Setup file log
Cài đặtPM> Install-Package Serilog.Sinks.File
Bạn cập nhật lại config như sau:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new JsonFormatter())
.WriteTo.File("log/log.txt")
.CreateLogger();
Trường hợp bạn muốn chia file log theo ngày
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new JsonFormatter())
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
Nếu bạn muốn giới hạn dung lượng mỗi file log, sử dung fileSizeLimitBytes
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new JsonFormatter())
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 10000000)
.CreateLogger();
Ngoài ra, bạn chỉ có nhu cầu giữ 12 file log gần nhất, hoặc mặc định là 31 file
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new JsonFormatter())
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 10000000,
retainedFileCountLimit: 12)
.CreateLogger();
Thêm Serilog vào middleware
namespace SerilogDemo;
class SerilogMiddleware
{
private readonly RequestDelegate _next;
private readonly ILoggerFactory _loggerFactory;
public SerilogMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_loggerFactory = loggerFactory;
}
public async Task Invoke(HttpContext httpContext)
{
var _logger = _loggerFactory.CreateLogger<SerilogMiddleware>();
try
{
_logger.LogInformation("Performing Middleware operation");
// Perform some Database action into Middleware
_logger.LogWarning("Performing Middleware Save operation");
//Save Data
_logger.LogInformation("Save Comepleted");
await _next(httpContext);
}
catch (Exception ex)
{
_logger.LogError($"Something went wrong: {ex.Message}");
}
}
}
Tham khảo
https://www.talkingdotnet.com/add-or-enable-serilog-in-asp-net-core-7-0/
Nhận xét
Đăng nhận xét