Phase 14 of 30 · Topic 14.5

High-Performance Structured Logging with `[LoggerMessage]`

1Concept

Standard `_logger.LogInformation("User {id}", id)` performs string parsing and object array allocation. The `[LoggerMessage]` source generator creates strongly-typed zero-allocation loggers at compile time.

2Architecture Diagram

Traditional Logger:
_logger.LogInformation("Processing {id}", id) ──> Allocates `object[]` params + string format

[LoggerMessage] Source Generator:
LogProcessing(id) ──> Emits cached static action (ZERO heap allocation!)

3Code Example

C# 13 & .NET 9
using System;
using Microsoft.Extensions.Logging;

public static partial class LogExtensions
{
    // High-performance compile-time source generated logger
    [LoggerMessage(EventId = 101, Level = LogLevel.Information, Message = "Order #{orderId} processed successfully for User #{userId}.")]
    public static partial void LogOrderSuccess(ILogger logger, int orderId, string userId);
}

public class StructuredLoggingDemo
{
    public static void Main()
    {
        Console.WriteLine("Source Generator [LoggerMessage] eliminates object[] boxing and message template parsing.");
    }
}

4Expected Output

Source Generator [LoggerMessage] eliminates object[] boxing and message template parsing.

5Key Takeaways

  • Always use `[LoggerMessage]` source generation in high-throughput APIs.
  • Pre-formats log event IDs for centralized search in Elasticsearch/Splunk.
  • Avoid string concatenation in logging statements.