refactor(configmanager): convert CLI to structured logging with Serilog

Replace Console.WriteLine calls with ILogger usage across all CLI commands.
Serilog is configured via DI with clean message-only output suitable for
CLI tooling. Log levels map to --quiet (Warning), default (Information),
and --verbose (Debug) flags.

- Add Serilog packages and configure in Program.cs
- Convert all 7 command files to use ILoggerFactory from DI
- Add BeginScope with context properties (Command, ConfigPath, etc.)
- Create logging_style.md documenting patterns and best practices
- Update tests with TestLoggingHelper for Serilog test configuration
This commit is contained in:
Joseph Doherty
2026-01-28 15:53:08 -05:00
parent 61694ca50b
commit 6f3e12b3b4
18 changed files with 1684 additions and 1220 deletions
@@ -31,6 +31,7 @@ public class ValidateCommandTests
services.AddSingleton(_autoDiscoveryService);
services.AddSingleton(_validationService);
services.AddSingleton(_runtimeValidationService);
services.AddTestLogging();
_serviceProvider = services.BuildServiceProvider();
_configPathOption = new Option<string?>(["--config-path", "-c"]);
@@ -193,10 +194,10 @@ public class ValidateCommandTests
rootCommand.AddGlobalOption(_verboseOption);
rootCommand.AddGlobalOption(_quietOption);
// Capture console error output
var originalErr = Console.Error;
// Capture console output (Serilog writes all output to stdout)
var originalOut = Console.Out;
using var writer = new StringWriter();
Console.SetError(writer);
Console.SetOut(writer);
try
{
@@ -205,11 +206,11 @@ public class ValidateCommandTests
// Assert
var output = writer.ToString();
output.ShouldContain("Error");
output.ShouldContain("Connection string 'LocalCache' is required");
}
finally
{
Console.SetError(originalErr);
Console.SetOut(originalOut);
}
}
finally