Skip to content

Commit 45f7af4

Browse files
authored
Replaces string interpolation with structured logging (#2930)
Converts manual log message formatting to LoggerMessage source generator methods for better performance and structured logging support. Improves logging efficiency by eliminating string allocations when logging is disabled and provides consistent structured data for log analysis tools.
1 parent b3aeb61 commit 45f7af4

File tree

4 files changed

+55
-9
lines changed

4 files changed

+55
-9
lines changed

src/StackExchange.Redis/ConnectionMultiplexer.Sentinel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ internal void SwitchPrimary(EndPoint? switchBlame, ConnectionMultiplexer connect
396396
var logger = Logger.With(writer);
397397
if (connection.RawConfig.ServiceName is not string serviceName)
398398
{
399-
logger?.LogInformation("Service name not defined.");
399+
logger?.LogInformationServiceNameNotDefined();
400400
return;
401401
}
402402

src/StackExchange.Redis/ConnectionMultiplexer.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,14 +1335,16 @@ internal void GetStatus(ILogger? log)
13351335
if (log == null) return;
13361336

13371337
var tmp = GetServerSnapshot();
1338-
log?.LogInformation("Endpoint Summary:");
1338+
log.LogInformationEndpointSummaryHeader();
13391339
foreach (var server in tmp)
13401340
{
1341-
log?.LogInformation(" " + server.Summary());
1342-
log?.LogInformation(" " + server.GetCounters().ToString());
1343-
log?.LogInformation(" " + server.GetProfile());
1341+
log.LogInformationServerSummary(server.Summary(), server.GetCounters(), server.GetProfile());
13441342
}
1345-
log?.LogInformation($"Sync timeouts: {Interlocked.Read(ref syncTimeouts)}; async timeouts: {Interlocked.Read(ref asyncTimeouts)}; fire and forget: {Interlocked.Read(ref fireAndForgets)}; last heartbeat: {LastHeartbeatSecondsAgo}s ago");
1343+
log.LogInformationTimeoutsSummary(
1344+
Interlocked.Read(ref syncTimeouts),
1345+
Interlocked.Read(ref asyncTimeouts),
1346+
Interlocked.Read(ref fireAndForgets),
1347+
LastHeartbeatSecondsAgo);
13461348
}
13471349

13481350
private void ActivateAllServers(ILogger? log)

src/StackExchange.Redis/EndPointCollection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,12 @@ internal async Task ResolveEndPointsAsync(ConnectionMultiplexer multiplexer, ILo
209209
}
210210
else
211211
{
212-
log?.LogInformation($"Using DNS to resolve '{dns.Host}'...");
212+
log?.LogInformationUsingDnsToResolve(dns.Host);
213213
var ips = await Dns.GetHostAddressesAsync(dns.Host).ObserveErrors().ForAwait();
214214
if (ips.Length == 1)
215215
{
216216
ip = ips[0];
217-
log?.LogInformation($"'{dns.Host}' => {ip}");
217+
log?.LogInformationDnsResolutionResult(dns.Host, ip);
218218
cache[dns.Host] = ip;
219219
this[i] = new IPEndPoint(ip, dns.Port);
220220
}
@@ -223,7 +223,7 @@ internal async Task ResolveEndPointsAsync(ConnectionMultiplexer multiplexer, ILo
223223
catch (Exception ex)
224224
{
225225
multiplexer.OnInternalError(ex);
226-
log?.LogError(ex, ex.Message);
226+
log?.LogErrorDnsResolution(ex, ex.Message);
227227
}
228228
}
229229
}

src/StackExchange.Redis/LoggerExtensions.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,4 +665,48 @@ internal static void LogWithThreadPoolStats(this ILogger? log, string message)
665665
EventId = 100,
666666
Message = "{BridgeName}: Connected")]
667667
internal static partial void LogInformationConnected(this ILogger logger, string bridgeName);
668+
669+
// ConnectionMultiplexer GetStatus logging methods
670+
[LoggerMessage(
671+
Level = LogLevel.Information,
672+
EventId = 101,
673+
Message = "Endpoint Summary:")]
674+
internal static partial void LogInformationEndpointSummaryHeader(this ILogger logger);
675+
676+
[LoggerMessage(
677+
Level = LogLevel.Information,
678+
EventId = 102,
679+
Message = "Server summary: {ServerSummary}, counters: {ServerCounters}, profile: {ServerProfile}")]
680+
internal static partial void LogInformationServerSummary(this ILogger logger, string serverSummary, ServerCounters serverCounters, string serverProfile);
681+
682+
[LoggerMessage(
683+
Level = LogLevel.Information,
684+
EventId = 105,
685+
Message = "Sync timeouts: {SyncTimeouts}; async timeouts: {AsyncTimeouts}; fire and forget: {FireAndForgets}; last heartbeat: {LastHeartbeatSecondsAgo}s ago")]
686+
internal static partial void LogInformationTimeoutsSummary(this ILogger logger, long syncTimeouts, long asyncTimeouts, long fireAndForgets, long lastHeartbeatSecondsAgo);
687+
688+
// EndPointCollection logging methods
689+
[LoggerMessage(
690+
Level = LogLevel.Information,
691+
EventId = 106,
692+
Message = "Using DNS to resolve '{DnsHost}'...")]
693+
internal static partial void LogInformationUsingDnsToResolve(this ILogger logger, string dnsHost);
694+
695+
[LoggerMessage(
696+
Level = LogLevel.Information,
697+
EventId = 107,
698+
Message = "'{DnsHost}' => {IpAddress}")]
699+
internal static partial void LogInformationDnsResolutionResult(this ILogger logger, string dnsHost, IPAddress ipAddress);
700+
701+
[LoggerMessage(
702+
Level = LogLevel.Error,
703+
EventId = 108,
704+
Message = "{ErrorMessage}")]
705+
internal static partial void LogErrorDnsResolution(this ILogger logger, Exception exception, string errorMessage);
706+
707+
[LoggerMessage(
708+
Level = LogLevel.Information,
709+
EventId = 109,
710+
Message = "Service name not defined.")]
711+
internal static partial void LogInformationServiceNameNotDefined(this ILogger logger);
668712
}

0 commit comments

Comments
 (0)