diff --git a/src/ConnyConsole/Cli/Config/SetConfigCommand.cs b/src/ConnyConsole/Cli/Config/SetConfigCommand.cs
index 1ac9af1..408a0ee 100644
--- a/src/ConnyConsole/Cli/Config/SetConfigCommand.cs
+++ b/src/ConnyConsole/Cli/Config/SetConfigCommand.cs
@@ -6,7 +6,7 @@
namespace ConnyConsole.Cli.Config;
-public sealed class SetConfigCommand : Command
+public sealed partial class SetConfigCommand : Command
{
private readonly IConfigurationEditor _configurationEditor;
private readonly ILogger _logger;
@@ -64,7 +64,7 @@ private void Handle(ParseResult parseResult, SettingKeyArgument keyArgument, Set
var scope = GetConfigurationScope(parseResult);
var resultMessage = _configurationEditor.SetValue(key, value, scope);
- _logger.LogInformation("Set setting result: {Message}", resultMessage);
+ LogSetSettingResultMessage(resultMessage);
}
catch (Exception exception)
{
diff --git a/src/ConnyConsole/Cli/Config/SetConfigCommand.logger.cs b/src/ConnyConsole/Cli/Config/SetConfigCommand.logger.cs
new file mode 100644
index 0000000..6a3d9a9
--- /dev/null
+++ b/src/ConnyConsole/Cli/Config/SetConfigCommand.logger.cs
@@ -0,0 +1,9 @@
+using Microsoft.Extensions.Logging;
+
+namespace ConnyConsole.Cli.Config;
+
+public sealed partial class SetConfigCommand
+{
+ [LoggerMessage(LogLevel.Information, "Set setting result: {message}")]
+ private partial void LogSetSettingResultMessage(string message);
+}
diff --git a/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.cs b/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.cs
index 0a3ceef..86ba140 100644
--- a/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.cs
+++ b/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.cs
@@ -3,7 +3,7 @@
namespace ConnyConsole.Infrastructure;
///
-public class ConsoleCancellationTokenSource(
+public partial class ConsoleCancellationTokenSource(
ILogger logger,
IEnvironmentProvider environmentProvider)
: CancellationTokenSource
@@ -31,9 +31,7 @@ public ConsoleCancelEventHandler CreateCancellationHandler(TimeSpan timeout)
{
if (_isGracefulCancelled)
{
- logger.LogInformation(
- "Received interrupt signal, attempting to shut down gracefully but will force-close in {Seconds} seconds. Send again to immediately force-close.",
- timeout.TotalSeconds);
+ LogGracefulShutdownInitiated(timeout.TotalSeconds);
Cancel();
cancelEvent.Cancel = true;
@@ -43,7 +41,7 @@ public ConsoleCancelEventHandler CreateCancellationHandler(TimeSpan timeout)
}
else
{
- logger.LogInformation("Second interrupt received, force-closing the app");
+ LogForceShutdownInitiated();
ExitApplication();
}
};
@@ -54,12 +52,6 @@ public ConsoleCancelEventHandler CreateCancellationHandler(TimeSpan timeout)
///
private void EnforceExitAfterTimeout(int timeoutInMilliseconds)
{
- void LogAndExit()
- {
- logger.LogInformation("Timeout reached, force-closing app.");
- ExitApplication();
- }
-
if (timeoutInMilliseconds > 0)
{
_ = new Timer(_ => LogAndExit(),
@@ -71,6 +63,14 @@ void LogAndExit()
{
LogAndExit();
}
+
+ return;
+
+ void LogAndExit()
+ {
+ LogForceShutdownAfterTimeout();
+ ExitApplication();
+ }
}
///
diff --git a/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.logger.cs b/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.logger.cs
new file mode 100644
index 0000000..a5c3a4a
--- /dev/null
+++ b/src/ConnyConsole/Infrastructure/ConsoleCancellationTokenSource.logger.cs
@@ -0,0 +1,16 @@
+using Microsoft.Extensions.Logging;
+
+namespace ConnyConsole.Infrastructure;
+
+public sealed partial class ConsoleCancellationTokenSource
+{
+ [LoggerMessage(LogLevel.Information,
+ "Received interrupt signal, attempting to shut down gracefully but will force-close in {seconds} seconds. Send again to immediately force-close.")]
+ private partial void LogGracefulShutdownInitiated(double seconds);
+
+ [LoggerMessage(LogLevel.Information, "Second interrupt received, force-closing the app")]
+ private partial void LogForceShutdownInitiated();
+
+ [LoggerMessage(LogLevel.Information, "Timeout reached, force-closing app.")]
+ private partial void LogForceShutdownAfterTimeout();
+}
diff --git a/src/ConnyConsole/Services/LogService.cs b/src/ConnyConsole/Services/LogService.cs
index 69990b7..00dc382 100644
--- a/src/ConnyConsole/Services/LogService.cs
+++ b/src/ConnyConsole/Services/LogService.cs
@@ -3,35 +3,18 @@
namespace ConnyConsole.Services;
///
-public sealed class LogService(ILogger logger) : ILogService
+public sealed partial class LogService(ILogger logger) : ILogService
{
- private const string MessageTemplate = "{Message}";
+ private const string MessageTemplate = "{message}";
public void Log(LogLevel level, string? message)
{
var logMessage = message ?? string.Empty;
- // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault - is marked by SonarQube rule csharpsquid:S3458
- switch (level)
- {
- case LogLevel.Critical:
- logger.LogCritical(MessageTemplate, logMessage);
- break;
- case LogLevel.Error:
- logger.LogError(MessageTemplate, logMessage);
- break;
- case LogLevel.Warning:
- logger.LogWarning(MessageTemplate, logMessage);
- break;
- case LogLevel.Debug:
- logger.LogDebug(MessageTemplate, logMessage);
- break;
- case LogLevel.Trace:
- logger.LogTrace(MessageTemplate, logMessage);
- break;
- default:
- logger.LogInformation(MessageTemplate, logMessage);
- break;
- }
+ var logLevel = level == LogLevel.None
+ ? LogLevel.Information
+ : level;
+
+ LogMessage(logLevel, logMessage);
}
}
diff --git a/src/ConnyConsole/Services/LogService.logger.cs b/src/ConnyConsole/Services/LogService.logger.cs
new file mode 100644
index 0000000..3b370e0
--- /dev/null
+++ b/src/ConnyConsole/Services/LogService.logger.cs
@@ -0,0 +1,9 @@
+using Microsoft.Extensions.Logging;
+
+namespace ConnyConsole.Services;
+
+public sealed partial class LogService
+{
+ [LoggerMessage(MessageTemplate)]
+ private partial void LogMessage(LogLevel logLevel, string message);
+}
diff --git a/tests/ConnyConsole.Tests/Services/LogServiceTests.cs b/tests/ConnyConsole.Tests/Services/LogServiceTests.cs
index b02a2ae..7451de7 100644
--- a/tests/ConnyConsole.Tests/Services/LogServiceTests.cs
+++ b/tests/ConnyConsole.Tests/Services/LogServiceTests.cs
@@ -226,7 +226,7 @@ public void Log_LeadingAndTrailingWhitespacesMessage_LogsMessageWithLeadingAndTr
{
// Arrange
var logService = new LogService(_logger);
- var message = $" {TestMessage} ";
+ const string message = $" {TestMessage} ";
// Act
logService.Log(LogLevel.Information, message);