Skip to content

Commit 1e56ea9

Browse files
Copilotarturcic
andcommitted
Add Serilog packages and create new logging infrastructure
Co-authored-by: arturcic <[email protected]>
1 parent 2ab74fc commit 1e56ea9

File tree

5 files changed

+135
-0
lines changed

5 files changed

+135
-0
lines changed

src/Directory.Packages.props

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@
1414
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
1515
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
1616
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
17+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.0" />
18+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
1719
<PackageVersion Include="Microsoft.IO.Redist" Version="6.1.3" />
20+
<PackageVersion Include="Serilog" Version="4.2.0" />
21+
<PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.0" />
22+
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
23+
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
1824
<PackageVersion Include="Polly" Version="8.6.4" />
1925
<PackageVersion Include="Roslynator.Analyzers" Version="4.14.1" />
2026
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.14.1" />

src/GitVersion.App/GitVersion.App.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
2121
<PackageReference Include="Microsoft.Extensions.Hosting" />
2222
<PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" />
23+
<PackageReference Include="Microsoft.Extensions.Logging" />
2324
</ItemGroup>
2425

2526
<ItemGroup>

src/GitVersion.Core/GitVersion.Core.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@
1414
<ItemGroup>
1515
<PackageReference Include="Polly" />
1616
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
17+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
1718
<PackageReference Include="Microsoft.Extensions.Options" />
19+
<PackageReference Include="Serilog" />
20+
<PackageReference Include="Serilog.Extensions.Logging" />
21+
<PackageReference Include="Serilog.Sinks.Console" />
22+
<PackageReference Include="Serilog.Sinks.File" />
1823
<PackageReference Include="System.IO.Abstractions" />
1924
</ItemGroup>
2025

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Diagnostics;
2+
using GitVersion.Helpers;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace GitVersion.Logging;
6+
7+
public static class LoggerExtensions
8+
{
9+
public static IDisposable IndentLog(this ILogger logger, string operationDescription)
10+
{
11+
var start = Stopwatch.GetTimestamp();
12+
logger.LogInformation("-< Begin: {Operation} >-", operationDescription);
13+
14+
return Disposable.Create(() =>
15+
{
16+
var duration = Stopwatch.GetElapsedTime(start).TotalMilliseconds;
17+
logger.LogInformation("-< End: {Operation} (Took: {Duration:N}ms) >-", operationDescription, duration);
18+
});
19+
}
20+
21+
public static void Separator(this ILogger logger)
22+
=> logger.LogInformation("-------------------------------------------------------");
23+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
using System.IO.Abstractions;
2+
using GitVersion.Extensions;
3+
using GitVersion.Helpers;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Logging;
6+
using Serilog;
7+
using Serilog.Events;
8+
using Serilog.Sinks.SystemConsole.Themes;
9+
10+
namespace GitVersion.Logging;
11+
12+
public class LoggingModule
13+
{
14+
public static IServiceCollection AddLogging(
15+
IServiceCollection services,
16+
Verbosity verbosity = Verbosity.Normal,
17+
bool addConsole = false,
18+
string? logFilePath = null,
19+
IFileSystem? fileSystem = null)
20+
{
21+
var loggerConfiguration = new LoggerConfiguration()
22+
.MinimumLevel.Verbose()
23+
.Enrich.FromLogContext();
24+
25+
if (addConsole)
26+
{
27+
loggerConfiguration = AddConsoleLogger(loggerConfiguration, verbosity);
28+
}
29+
30+
if (!string.IsNullOrWhiteSpace(logFilePath) && fileSystem != null)
31+
{
32+
loggerConfiguration = AddFileLogger(loggerConfiguration, fileSystem, logFilePath, verbosity);
33+
}
34+
35+
Log.Logger = loggerConfiguration.CreateLogger();
36+
37+
services.AddLogging(builder =>
38+
{
39+
builder.ClearProviders();
40+
builder.AddSerilog(Log.Logger, dispose: true);
41+
builder.SetMinimumLevel(MapVerbosityToMicrosoftLogLevel(verbosity));
42+
});
43+
44+
return services;
45+
}
46+
47+
private static LoggerConfiguration AddConsoleLogger(LoggerConfiguration configuration, Verbosity verbosity)
48+
{
49+
var logLevel = MapVerbosityToSerilogLevel(verbosity);
50+
51+
return configuration.WriteTo.Console(
52+
restrictedToMinimumLevel: logLevel,
53+
outputTemplate: "{Level:u} [{Timestamp:yy-MM-dd H:mm:ss:ff}] {Message:lj}{NewLine}{Exception}",
54+
theme: AnsiConsoleTheme.Code,
55+
applyThemeToRedirectedOutput: true
56+
);
57+
}
58+
59+
private static LoggerConfiguration AddFileLogger(
60+
LoggerConfiguration configuration,
61+
IFileSystem fileSystem,
62+
string filePath,
63+
Verbosity verbosity)
64+
{
65+
fileSystem.NotNull();
66+
67+
var logFile = fileSystem.FileInfo.New(FileSystemHelper.Path.GetFullPath(filePath));
68+
logFile.Directory?.Create();
69+
70+
var logLevel = MapVerbosityToSerilogLevel(verbosity);
71+
72+
return configuration.WriteTo.File(
73+
path: filePath,
74+
restrictedToMinimumLevel: logLevel,
75+
outputTemplate: "{Level:u} [{Timestamp:yyyy-MM-dd HH:mm:ss}] {Message:lj}{NewLine}{Exception}",
76+
shared: true,
77+
flushToDiskInterval: TimeSpan.FromSeconds(1)
78+
);
79+
}
80+
81+
private static LogEventLevel MapVerbosityToSerilogLevel(Verbosity verbosity) => verbosity switch
82+
{
83+
Verbosity.Quiet => LogEventLevel.Error,
84+
Verbosity.Minimal => LogEventLevel.Warning,
85+
Verbosity.Normal => LogEventLevel.Information,
86+
Verbosity.Verbose => LogEventLevel.Verbose,
87+
Verbosity.Diagnostic => LogEventLevel.Debug,
88+
_ => LogEventLevel.Information
89+
};
90+
91+
private static Microsoft.Extensions.Logging.LogLevel MapVerbosityToMicrosoftLogLevel(Verbosity verbosity) => verbosity switch
92+
{
93+
Verbosity.Quiet => Microsoft.Extensions.Logging.LogLevel.Error,
94+
Verbosity.Minimal => Microsoft.Extensions.Logging.LogLevel.Warning,
95+
Verbosity.Normal => Microsoft.Extensions.Logging.LogLevel.Information,
96+
Verbosity.Verbose => Microsoft.Extensions.Logging.LogLevel.Debug,
97+
Verbosity.Diagnostic => Microsoft.Extensions.Logging.LogLevel.Trace,
98+
_ => Microsoft.Extensions.Logging.LogLevel.Information
99+
};
100+
}

0 commit comments

Comments
 (0)