using Microsoft.Extensions.Logging; using System.Extensions; namespace System.Logging; public struct ScopedLogger { private readonly ILogger logger; private readonly string scope; private readonly string flowId; private ScopedLogger(ILogger logger, string scope, string flowId) { this.logger = logger; this.scope = scope; this.flowId = flowId.IsNullOrWhiteSpace() ? string.Empty : $"[{flowId}] "; } public ScopedLogger LogInformation(string message, params object[] parameters) { this.logger.LogInformation(this.CreateMessage(message), parameters); return this; } public ScopedLogger LogDebug(string message, params object[] parameters) { this.logger.LogDebug(this.CreateMessage(message), parameters); return this; } public ScopedLogger LogWarning(string message, params object[] parameters) { this.logger.LogWarning(this.CreateMessage(message), parameters); return this; } public ScopedLogger LogError(string message, params object[] parameters) { this.logger.LogError(this.CreateMessage(message), parameters); return this; } public ScopedLogger LogCritical(string message, params object[] parameters) { this.logger.LogCritical(this.CreateMessage(message), parameters); return this; } public ScopedLogger LogWarning(Exception e, string message, params object[] parameters) { this.logger.LogWarning(e, this.CreateMessage(message), parameters); return this; } public ScopedLogger LogError(Exception e, string message, params object[] parameters) { this.logger.LogError(e, this.CreateMessage(message), parameters); return this; } public ScopedLogger LogCritical(Exception e, string message, params object[] parameters) { this.logger.LogCritical(e, this.CreateMessage(message), parameters); return this; } private string CreateMessage(string message) { return $"{this.flowId}{this.scope}: {message}"; } public static ScopedLogger Create(ILogger logger, string scope, string flowId) { return new ScopedLogger(logger, scope.ThrowIfNull(nameof(scope)), flowId); } }