Logging in .NET Core: Built-in Logging vs Serilog with Full Implementation Guide

Logging in .NET Core: Built-in Logging vs Serilog with Full Implementation Guide

Logging is an essential aspect of application development. In .NET Core and beyond (.NET 5/6/7/8), Microsoft provides a built-in logging framework that is simple to use. However, when applications grow and logging needs become more advanced, third-party solutions like Serilog shine. In this blog, we will explore built-in logging, Serilog, their differences, and how to implement both in your .NET Core application.

 

1. .NET Core Built-in Logging Overview

.NET Core uses Microsoft.Extensions.Logging as a base logging interface. This logging abstraction allows logging to multiple destinations, such as:

  • Console
  • Debug
  • EventSource
  • EventLog (Windows only)
  • Azure Application Insights (via extensions)
  • Files (through third-party integrations)

Pros:

  • Simple to use
  • Built-in
  • Fully integrated with Dependency Injection (DI)

Cons:

  • Limited formatting options
  • No structured logging out-of-the-box

 

2. What is Serilog?

Serilog is a powerful, structured logging library designed for .NET applications. It focuses on structured log events with properties and values, making logs more readable and machine-parsable.

Pros:

  • Structured logging (key-value pair logs)
  • Rich and extensible sinks (File, SQL, Elasticsearch, Seq, etc.)
  • Advanced formatting and enrichment
  • Asynchronous logging support

Cons:

  • Requires additional setup and packages

 

3. Key Differences

Feature

Built-in Logging

Serilog

Structured logging

No

Yes

Formatting

Basic

Highly customizable

Output targets (sinks)

Limited

Extensive

File logging

Not built-in

Easy via Serilog sinks

Async support

No

Yes

Integrated with DI

Yes

Yes

 

4. Implementation Examples

A. Using Built-in Logging

// Program.cs (.NET 6+)

var builder = WebApplication.CreateBuilder(args);

 

// Configure built-in logging

builder.Logging.ClearProviders();

builder.Logging.AddConsole();

 

var app = builder.Build();

 

app.MapGet("/", (ILogger<Program> logger) =>

{

    logger.LogInformation("Request received at /");

    return "Hello World!";

});

 

app.Run();

 

B. Using Serilog with Console and File Logging

Step 1: Install Required Packages

dotnet add package Serilog.AspNetCore

dotnet add package Serilog.Sinks.Console

dotnet add package Serilog.Sinks.File

Step 2: Configure Serilog in Program.cs

using Serilog;

 

var builder = WebApplication.CreateBuilder(args);

 

// Setup Serilog

Log.Logger = new LoggerConfiguration()

    .WriteTo.Console()

    .WriteTo.File("Logs/log-.txt", rollingInterval: RollingInterval.Day)

    .Enrich.FromLogContext()

    .MinimumLevel.Debug()

    .CreateLogger();

 

builder.Host.UseSerilog();

 

var app = builder.Build();

 

app.MapGet("/", (ILogger<Program> logger) =>

{

    logger.LogInformation("Handled GET /");

    return "Hello from Serilog!";

});

 

app.Run();

 

5. Optional: Serilog with appsettings.json

Step 1: Add Additional Packages

dotnet add package Serilog.Settings.Configuration

Step 2: Configure appsettings.json

"Serilog": {

  "MinimumLevel": "Debug",

  "WriteTo": [

    { "Name": "Console" },

    {

      "Name": "File",

      "Args": {

        "path": "Logs/log-.txt",

        "rollingInterval": "Day"

      }

    }

  ],

  "Enrich": [ "FromLogContext" ]

}

Step 3: Update Program.cs

var builder = WebApplication.CreateBuilder(args);

 

Log.Logger = new LoggerConfiguration()

    .ReadFrom.Configuration(builder.Configuration)

    .CreateLogger();

 

builder.Host.UseSerilog();

 

6. Conclusion

Built-in logging is great for simple applications and quick setup, but as logging requirements grow, Serilog offers more flexibility, structured logs, and support for multiple advanced output sinks. With Serilog, you can build robust and maintainable logging infrastructures tailored for production. 

 

Comments

Popular posts from this blog

Promises in Angular

Mastering Your Angular Workflow: Essential CLI Commands for Efficient Development

Observables in Angular