Skip to content

Commit c308c9e

Browse files
committed
refactor(logging): Integrate Serilog with MS.Extensions.Hosting
Removes static logging configuration and enables dynamic verbosity control through an injectable `LoggingLevelSwitch`
1 parent 2739962 commit c308c9e

18 files changed

Lines changed: 125 additions & 221 deletions

src/Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.3" />
1919
<PackageVersion Include="Microsoft.IO.Redist" Version="6.1.3" />
2020
<PackageVersion Include="Serilog" Version="4.3.0" />
21-
<PackageVersion Include="Serilog.Extensions.Logging" Version="10.0.0" />
21+
<PackageVersion Include="Serilog.Extensions.Hosting" Version="10.0.0" />
2222
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
2323
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
2424
<PackageVersion Include="Serilog.Sinks.Map" Version="2.0.0" />

src/GitVersion.App.Tests/ArgumentParserOnBuildServerTests.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/GitVersion.App.Tests/ArgumentParserTests.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public void EmptyMeansUseCurrentDirectory()
3131
arguments.TargetPath.ShouldBe(SysEnv.CurrentDirectory);
3232
arguments.LogFilePath.ShouldBe(null);
3333
arguments.IsHelp.ShouldBe(false);
34+
arguments.NoFetch.ShouldBe(false);
3435
}
3536

3637
[Test]
@@ -737,22 +738,22 @@ public void NocacheTrueWhenDefined()
737738
arguments.NoCache.ShouldBe(true);
738739
}
739740

740-
[TestCase("-verbosity x", true, Verbosity.Normal)]
741-
[TestCase("-verbosity diagnostic", false, Verbosity.Diagnostic)]
742-
[TestCase("-verbosity Minimal", false, Verbosity.Minimal)]
743-
[TestCase("-verbosity NORMAL", false, Verbosity.Normal)]
744-
[TestCase("-verbosity quiet", false, Verbosity.Quiet)]
745-
[TestCase("-verbosity Verbose", false, Verbosity.Verbose)]
741+
[TestCase("x", true, Verbosity.Normal)]
742+
[TestCase("diagnostic", false, Verbosity.Diagnostic)]
743+
[TestCase("Minimal", false, Verbosity.Minimal)]
744+
[TestCase("NORMAL", false, Verbosity.Normal)]
745+
[TestCase("quiet", false, Verbosity.Quiet)]
746+
[TestCase("Verbose", false, Verbosity.Verbose)]
746747
public void CheckVerbosityParsing(string command, bool shouldThrow, Verbosity expectedVerbosity)
747748
{
748749
if (shouldThrow)
749750
{
750-
Assert.Throws<WarningException>(() => this.argumentParser.ParseArguments(command));
751+
Assert.Throws<WarningException>(() => ArgumentParser.ParseVerbosity(command));
751752
}
752753
else
753754
{
754-
var arguments = this.argumentParser.ParseArguments(command);
755-
arguments.Verbosity.ShouldBe(expectedVerbosity);
755+
var verbosity = ArgumentParser.ParseVerbosity(command);
756+
verbosity.ShouldBe(expectedVerbosity);
756757
}
757758
}
758759

src/GitVersion.App.Tests/HelpWriterTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void AllArgsAreInHelp()
2828

2929
{ nameof(Arguments.Diag) , "/diag" },
3030
{ nameof(Arguments.LogFilePath) , "/l" },
31-
{ nameof(Arguments.Verbosity), "/verbosity" },
31+
{ "verbosity", "/verbosity" },
3232
{ nameof(Arguments.Output) , "/output" },
3333
{ nameof(Arguments.OutputFile) , "/outputfile" },
3434
{ nameof(Arguments.ShowVariable), "/showvariable" },

src/GitVersion.App/ArgumentParser.cs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,45 @@
11
using System.IO.Abstractions;
2-
using GitVersion.Agents;
32
using GitVersion.Extensions;
43
using GitVersion.FileSystemGlobbing;
54
using GitVersion.Helpers;
5+
using GitVersion.Logging;
66
using GitVersion.OutputVariables;
7+
using Serilog.Core;
8+
using Serilog.Events;
79

810
namespace GitVersion;
911

10-
internal class ArgumentParser(IEnvironment environment,
11-
IFileSystem fileSystem,
12-
ICurrentBuildAgent buildAgent,
13-
IConsole console,
14-
IHelpWriter helpWriter,
15-
IVersionWriter versionWriter,
16-
IGlobbingResolver globbingResolver)
12+
internal class ArgumentParser(
13+
IEnvironment environment,
14+
IFileSystem fileSystem,
15+
IConsole console,
16+
IHelpWriter helpWriter,
17+
IVersionWriter versionWriter,
18+
IGlobbingResolver globbingResolver,
19+
LoggingLevelSwitch loggingLevelSwitch
20+
)
1721
: IArgumentParser
1822
{
1923
private readonly IEnvironment environment = environment.NotNull();
2024
private readonly IFileSystem fileSystem = fileSystem.NotNull();
21-
private readonly ICurrentBuildAgent buildAgent = buildAgent.NotNull();
2225
private readonly IConsole console = console.NotNull();
2326
private readonly IHelpWriter helpWriter = helpWriter.NotNull();
2427
private readonly IVersionWriter versionWriter = versionWriter.NotNull();
2528
private readonly IGlobbingResolver globbingResolver = globbingResolver.NotNull();
29+
private readonly LoggingLevelSwitch loggingLevelSwitch = loggingLevelSwitch.NotNull();
2630

2731
private const string defaultOutputFileName = "GitVersion.json";
2832
private static readonly IEnumerable<string> availableVariables = GitVersionVariables.AvailableVariables;
2933

34+
private static readonly Dictionary<Verbosity, LogEventLevel> VerbosityMaps = new()
35+
{
36+
{ Verbosity.Verbose, LogEventLevel.Verbose },
37+
{ Verbosity.Diagnostic, LogEventLevel.Debug },
38+
{ Verbosity.Normal, LogEventLevel.Information },
39+
{ Verbosity.Minimal, LogEventLevel.Warning },
40+
{ Verbosity.Quiet, LogEventLevel.Error }
41+
};
42+
3043
public Arguments ParseArguments(string commandLineArguments)
3144
{
3245
var arguments = QuotedStringHelpers.SplitUnquoted(commandLineArguments, ' ');
@@ -47,8 +60,6 @@ public Arguments ParseArguments(string[] commandLineArguments)
4760

4861
AddAuthentication(args);
4962

50-
args.NoFetch = this.buildAgent.PreventFetch();
51-
5263
return args;
5364
}
5465

@@ -57,20 +68,14 @@ public Arguments ParseArguments(string[] commandLineArguments)
5768
if (firstArgument.IsHelp())
5869
{
5970
this.helpWriter.Write();
60-
return new Arguments
61-
{
62-
IsHelp = true
63-
};
71+
return new Arguments { IsHelp = true };
6472
}
6573

6674
if (firstArgument.IsSwitch("version"))
6775
{
6876
var assembly = Assembly.GetExecutingAssembly();
6977
this.versionWriter.Write(assembly);
70-
return new Arguments
71-
{
72-
IsVersion = true
73-
};
78+
return new Arguments { IsVersion = true };
7479
}
7580

7681
var arguments = new Arguments();
@@ -103,7 +108,6 @@ public Arguments ParseArguments(string[] commandLineArguments)
103108
arguments.TargetPath = arguments.TargetPath.TrimEnd('/', '\\');
104109

105110
if (!arguments.EnsureAssemblyInfo) arguments.UpdateAssemblyInfoFileName = ResolveFiles(arguments.TargetPath, arguments.UpdateAssemblyInfoFileName).ToHashSet();
106-
arguments.NoFetch = arguments.NoFetch || this.buildAgent.PreventFetch();
107111

108112
ValidateConfigurationFile(arguments);
109113

@@ -203,7 +207,7 @@ private void ParseTargetPath(Arguments arguments, string? name, IReadOnlyList<st
203207
throw new WarningException(couldNotParseMessage);
204208
}
205209

206-
private static bool ParseSwitches(Arguments arguments, string? name, IReadOnlyList<string>? values, string? value)
210+
private bool ParseSwitches(Arguments arguments, string? name, IReadOnlyList<string>? values, string? value)
207211
{
208212
if (name.IsSwitch("l"))
209213
{
@@ -291,7 +295,8 @@ private static bool ParseSwitches(Arguments arguments, string? name, IReadOnlyLi
291295

292296
if (name.IsSwitch("verbosity"))
293297
{
294-
ParseVerbosity(arguments, value);
298+
var verbosity = ParseVerbosity(value);
299+
loggingLevelSwitch.MinimumLevel = VerbosityMaps[verbosity];
295300
return true;
296301
}
297302

@@ -436,12 +441,14 @@ private static void ParseOutput(Arguments arguments, IEnumerable<string>? values
436441
}
437442
}
438443

439-
private static void ParseVerbosity(Arguments arguments, string? value)
444+
internal static Verbosity ParseVerbosity(string? value)
440445
{
441-
if (!Enum.TryParse(value, true, out arguments.Verbosity))
446+
if (!Enum.TryParse(value, true, out Verbosity verbosity))
442447
{
443448
throw new WarningException($"Could not parse Verbosity value '{value}'");
444449
}
450+
451+
return verbosity;
445452
}
446453

447454
private static void ParseOverrideConfig(Arguments arguments, IReadOnlyCollection<string>? values)
@@ -465,8 +472,10 @@ private static void ParseOverrideConfig(Arguments arguments, IReadOnlyCollection
465472
{
466473
throw new WarningException($"Could not parse /overrideconfig option: {keyValueOption}. Unsupported 'key'.");
467474
}
475+
468476
parser.SetValue(optionKey, keyAndValue[1]);
469477
}
478+
470479
arguments.OverrideConfiguration = parser.GetOverrideConfiguration();
471480
}
472481

@@ -505,6 +514,7 @@ private static void ParseUpdateAssemblyInfo(Arguments arguments, string? value,
505514
{
506515
throw new WarningException("Cannot specify both updateprojectfiles and updateassemblyinfo in the same run. Please rerun GitVersion with only one parameter");
507516
}
517+
508518
if (arguments.UpdateAssemblyInfoFileName.Count > 1 && arguments.EnsureAssemblyInfo)
509519
{
510520
throw new WarningException("Can't specify multiple assembly info files when using -ensureassemblyinfo switch, either use a single assembly info file or do not specify -ensureassemblyinfo and create assembly info files manually");
@@ -546,6 +556,7 @@ private static void ParseUpdateProjectInfo(Arguments arguments, string? value, I
546556
{
547557
throw new WarningException("Cannot specify both updateassemblyinfo and updateprojectfiles in the same run. Please rerun GitVersion with only one parameter");
548558
}
559+
549560
if (arguments.EnsureAssemblyInfo)
550561
{
551562
throw new WarningException("Cannot specify -ensureassemblyinfo with updateprojectfiles: please ensure your project file exists before attempting to update it");

src/GitVersion.App/ArgumentParserExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace GitVersion;
55

6+
#pragma warning disable S1144
67
internal static class ArgumentParserExtensions
78
{
89
private static readonly string[] TrueValues = ["1", "true"];
@@ -85,3 +86,4 @@ public bool ArgumentRequiresValue(int argumentIndex)
8586
}
8687
}
8788
}
89+
#pragma warning restore S1144

src/GitVersion.App/Arguments.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using GitVersion.Git;
2-
using GitVersion.Logging;
32

43
namespace GitVersion;
54

@@ -32,7 +31,6 @@ internal class Arguments
3231
public string? Format;
3332
public string? OutputFile;
3433
public ISet<OutputType> Output = new HashSet<OutputType>();
35-
public Verbosity Verbosity = Verbosity.Normal;
3634

3735
public bool UpdateWixVersionFile;
3836
public bool UpdateProjectFiles;
@@ -94,7 +92,6 @@ public GitVersionOptions ToOptions()
9492
LogFilePath = LogFilePath,
9593
ShowVariable = ShowVariable,
9694
Format = Format,
97-
Verbosity = Verbosity,
9895
Output = Output,
9996
OutputFile = OutputFile
10097
};

src/GitVersion.App/CliHost.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,24 @@
22
using GitVersion.Configuration;
33
using GitVersion.Extensions;
44
using GitVersion.Output;
5+
using Serilog;
6+
using Serilog.Core;
57

68
namespace GitVersion;
79

810
internal static class CliHost
911
{
1012
internal static HostApplicationBuilder CreateCliHostBuilder(string[] args)
1113
{
14+
var bootstrapSwitch = new LoggingLevelSwitch();
15+
16+
Log.Logger = new LoggerConfiguration()
17+
.MinimumLevel.ControlledBy(bootstrapSwitch)
18+
.WriteTo.Console()
19+
.CreateBootstrapLogger();
20+
1221
var builder = Host.CreateApplicationBuilder(args);
22+
builder.Services.AddSingleton(bootstrapSwitch);
1323

1424
RegisterGitVersionModules(builder.Services, args);
1525

src/GitVersion.App/GitVersionApp.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using GitVersion.Extensions;
2-
using GitVersion.Logging;
32

43
namespace GitVersion;
54

@@ -17,8 +16,6 @@ public Task RunAsync(CancellationToken _)
1716
try
1817
{
1918
var gitVersionOptions = this.options.Value;
20-
LoggingEnricher.Configure(gitVersionOptions);
21-
2219
if (gitVersionOptions.IsHelp || gitVersionOptions.IsVersion)
2320
{
2421
SysEnv.ExitCode = 0;

src/GitVersion.App/GitVersionExecutor.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using GitVersion.Extensions;
44
using GitVersion.Git;
55
using GitVersion.Helpers;
6+
using Serilog;
67

78
namespace GitVersion;
89

@@ -42,12 +43,7 @@ public int Execute(GitVersionOptions gitVersionOptions)
4243

4344
if (exitCode != 0)
4445
{
45-
// Inform user where to find detailed logs if a log file was configured
46-
var logFilePath = gitVersionOptions.LogFilePath;
47-
if (!logFilePath.IsNullOrWhiteSpace() && !logFilePath.Equals("console", StringComparison.OrdinalIgnoreCase))
48-
{
49-
this.console.WriteLine($"See log file for more details: {logFilePath}");
50-
}
46+
Log.CloseAndFlush();
5147
}
5248

5349
return exitCode;

0 commit comments

Comments
 (0)