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.