Roadmap › Logging & Custom Logging in .NET — ILogger, Serilog, NLog, log4net and Your Own Logger › Module: Logging Libraries
Lessons in this course (8)
4. Serilog — sinks, enrichers and request logging
Intermediate★ Must knowLesson 4 of 8
csharp
// dotnet add package Serilog.AspNetCore Serilog.Sinks.Seq Serilog.Sinks.File
using Serilog;
Log.Logger = new LoggerConfiguration() // bootstrap logger to capture startup errors
.WriteTo.Console()
.CreateBootstrapLogger();
try
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSerilog((services, cfg) => cfg
.ReadFrom.Configuration(builder.Configuration) // levels/sinks from appsettings "Serilog" section
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.Enrich.WithProperty("Application", "Shop.Api")
.WriteTo.Console()
.WriteTo.File("logs/shop-.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 14)
.WriteTo.Seq("http://localhost:5341"));
var app = builder.Build();
app.UseSerilogRequestLogging(); // one summary event per request: method, path, status, elapsed
app.MapControllers();
app.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
Log.CloseAndFlush(); // flush buffered sinks
}json
"Serilog": {
"MinimumLevel": { "Default": "Information", "Override": { "Microsoft.AspNetCore": "Warning" } }
}Concepts: sinks (Console, File, Seq, Elasticsearch, Application Insights, SQL Server via Serilog.Sinks.MSSqlServer), enrichers (machine name, thread id, environment, user), destructuring ({@Order} logs the object's properties; {$Order} its ToString), LogContext.PushProperty("TenantId", id).