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).