using System.Diagnostics; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace BGR.Console.Logging; internal static class LoggerExtensions { private static readonly Action RemovalCommandFailedMsg = LoggerMessage.Define( LogLevel.Error, new EventId(0, nameof(RemovalCommandFailed)), "An error occurred while executing the command." ); private static readonly Action TimeAndLogActionMsg = LoggerMessage.Define( LogLevel.Information, new EventId(0, nameof(TimeAndLogAction)), "{Message} in {ElapsedMilliseconds}ms" ); public static void RemovalCommandFailed(this ILogger logger, Exception ex) { RemovalCommandFailedMsg(logger, ex); } public static async Task TimeAndLogActionAsync(this ILogger logger, string message, Func action) { var sw = new Stopwatch(); sw.Start(); await action(); sw.Stop(); TimeAndLogActionMsg(logger, message, sw.ElapsedMilliseconds, default!); } public static async Task TimeAndLogActionAsync(this ILogger logger, string message, Func> action) { var sw = new Stopwatch(); sw.Start(); var result = await action(); sw.Stop(); TimeAndLogActionMsg(logger, message, sw.ElapsedMilliseconds, default!); return result; } public static void TimeAndLogAction(this ILogger logger, string message, Action action) { var sw = new Stopwatch(); sw.Start(); action(); sw.Stop(); TimeAndLogActionMsg(logger, message, sw.ElapsedMilliseconds, default!); } public static T TimeAndLogAction(this ILogger logger, string message, Func action) { var sw = new Stopwatch(); sw.Start(); var result = action(); sw.Stop(); TimeAndLogActionMsg(logger, message, sw.ElapsedMilliseconds, default!); return result; } }