Skip to main content

Command Palette

Search for a command to run...

Error Handling & Logging with Serilog in ASP.NET Core

Updated
2 min read
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 💡

More from this blog

T

Tunde Hub

40 posts

Sharing practical insights, tools, and tutorials on .NET, ASP.NET Core, cloud, and open source, empowering developers to build with confidence and grow their craft.