logfmt.net

Fast, structured logging for .NET in logfmt format

$ dotnet add package logfmt.net click to copy
ts=2026-03-22T03:44:07Z level=info msg="User logged in" user_id=123 service=api
~110ns
per log call
264B
allocation per call
0 alloc
when filtered

High Performance

Thread-static StringBuilder reuse, cached severity strings, zero-alloc filtered calls. Built for hot paths.

🔌

Microsoft.Extensions.Logging

Drop-in ILoggerProvider. One line to wire up with ASP.NET Core or Generic Host.

📡

OpenTelemetry

Export OpenTelemetry log records in logfmt format with trace context, attributes, and exceptions.

🎯

Modern .NET

Targets .NET 8.0 and .NET 10.0. Nullable reference types, file-scoped namespaces, implicit usings.

🔧

Flexible Output

Console by default, or any Stream. WithData() builder pattern for default fields across log entries.

🛡️

Thread Safe

Shared write locks across WithData-derived loggers. Safe for concurrent multi-threaded logging.

Get started in seconds

  Basic Usage
using Logfmt;

var log = new Logger();
log.Info("Server started", "port", "8080");

// With default fields on every entry
var log = new Logger().WithData("service", "api");
log.Info("Request handled", "status", "200");
  ASP.NET Core
using Logfmt.ExtensionLogging;

builder.Logging.ClearProviders();
builder.Logging.AddLogfmt();

// Then inject and use ILogger as usual
_logger.LogInformation("Processing {RequestId}", id);
  OpenTelemetry
using Logfmt.OpenTelemetryLogging;

builder.Logging.AddOpenTelemetry(options =>
{
    options.AddLogfmtConsoleExporter();
});