Console Logging in ASP.NET Core with Serilog

Goal: Set up Serilog for console logging in an ASP.NET Core Web API.

Install Serilog

dotnet add package Serilog.AspNetCore

Configure Serilog in Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .CreateLogger();

        try
        {
            Log.Information("Starting web host");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Enable Request Logging

// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseSerilogRequestLogging();

    ...
}

Use the Logger

[ApiController]
[Route("[controller]")]
public class OpsController : ControllerBase
{
    private readonly ILogger<OpsController> _logger;

    public OpsController(ILogger<OpsController> logger)
    {
        _logger = logger;
    }

    [HttpGet, Route("{currency}")]
    public async Task<IActionResult> Get(string currency)
    {
        _logger.LogInformation("Processed request /ops in {currency}", currency);
        return Ok(result);
    }
}