Vì string interpolation làm mất structured logging và làm mất luôn tối ưu theo log level.
API logging của .NET nhận message template cùng danh sách tham số. Provider (Serilog, OpenTelemetry, Application Insights) lưu template và từng cặp tên–giá trị riêng, nhờ vậy bạn truy vấn được userId = 42 trên hệ thống tập trung. Nếu nội suy sẵn thành chuỗi, log chỉ còn một câu văn phẳng, không lọc được, và mỗi lần gọi là một chuỗi khác nhau nên không nhóm được theo sự kiện.
// bad: value baked into the message, string built even when Information is off
_logger.LogInformation($"User {userId} logged in from {ip}");
// good: template stays constant, values captured as named properties
_logger.LogInformation("User {UserId} logged in from {Ip}", userId, ip);Điểm thứ hai về hiệu năng: với template, chuỗi chỉ được dựng khi level đó thật sự bật; với $"..." chuỗi luôn được dựng, kể cả khi log Debug đang tắt ở production.
Analyzer CA2254 bắt đúng lỗi này. Với đường log nóng, dùng source generator [LoggerMessage] để loại bỏ cả boxing lẫn cấp phát.
Lưu ý placeholder trong template khớp theo thứ tự, không theo tên — đặt sai thứ tự tham số là ghi nhầm giá trị.