Error Handling & Logging with Serilog in ASP.NET Core

You can’t fix what you can’t see. That’s why error handling and structured logging are critical in production ASP.NET Core apps.

In this article, we’ll integrate Serilog, handle errors globally, and capture logs like a pro.


🔧 Why Serilog?

Serilog is a diagnostic logging library that makes logs:

  • 🔍 Searchable
  • 📊 Structured (JSON, key-value pairs)
  • 🔌 Pluggable (to file, console, Seq, Application Insights, etc.)

📦 Step 1: Install Serilog Packages

dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File

Optional:

dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Seq

🛠️ Step 2: Configure Serilog in Program.cs

using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("Logs/log.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog();

var app = builder.Build();

Now all logs are automatically captured.


⚠️ Step 3: Global Error Handling

Create a middleware:

public class ErrorHandlerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ErrorHandlerMiddleware> _logger;

    public ErrorHandlerMiddleware(RequestDelegate next, ILogger<ErrorHandlerMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Unhandled error occurred.");
            context.Response.StatusCode = 500;
            await context.Response.WriteAsJsonAsync(new { error = "An unexpected error occurred." });
        }
    }
}

Register it in Program.cs before other middleware:

app.UseMiddleware<ErrorHandlerMiddleware>();

🧪 Where Logs Go

By default:

  • Console → for local development
  • Logs/log.txt → daily rotating files

Optional: send logs to:

  • 📊 Seq (real-time log dashboard)
  • ☁️ Azure Application Insights
  • 📤 ElasticSearch

🧠 Best Practices

  • ✅ Log structured data (@object) instead of raw strings
  • ✅ Avoid logging sensitive data (passwords, tokens)
  • ✅ Use log levels appropriately: Information, Warning, Error, Fatal, Debug

✅ Up Next

Your app can now self-report errors. Next, we’ll learn how to build Minimal APIs for fast, focused endpoints without full controller setup.

➡️ Minimal APIs: Fast, Lean, and Powerful →

Let’s keep your code clean and your logs even cleaner 💡

0
Subscribe to my newsletter

Read articles from Esanju Babatunde directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Esanju Babatunde
Esanju Babatunde