Skip to content

Commit 7e51888

Browse files
authored
Print All Loggers in Order of Last Written to (#5)
1 parent c1038e5 commit 7e51888

File tree

5 files changed

+60
-7
lines changed

5 files changed

+60
-7
lines changed

ModularPipelines/Engine/PipelineExecutor.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ internal class PipelineExecutor : IPipelineExecutor
1414
private readonly EngineCancellationToken _engineCancellationToken;
1515
private readonly IDependencyDetector _dependencyDetector;
1616
private readonly IModuleResultPrinter _moduleResultPrinter;
17+
private readonly IModuleLoggerContainer _moduleLoggerContainer;
1718

1819
public PipelineExecutor(
1920
IPipelineSetupExecutor pipelineSetupExecutor,
@@ -23,7 +24,8 @@ public PipelineExecutor(
2324
IModuleExecutor moduleExecutor,
2425
EngineCancellationToken engineCancellationToken,
2526
IDependencyDetector dependencyDetector,
26-
IModuleResultPrinter moduleResultPrinter)
27+
IModuleResultPrinter moduleResultPrinter,
28+
IModuleLoggerContainer moduleLoggerContainer)
2729
{
2830
_pipelineSetupExecutor = pipelineSetupExecutor;
2931
_pipelineConsolePrinter = pipelineConsolePrinter;
@@ -33,6 +35,7 @@ public PipelineExecutor(
3335
_engineCancellationToken = engineCancellationToken;
3436
_dependencyDetector = dependencyDetector;
3537
_moduleResultPrinter = moduleResultPrinter;
38+
_moduleLoggerContainer = moduleLoggerContainer;
3639
}
3740

3841
public async Task<IReadOnlyList<ModuleBase>> ExecuteAsync()
@@ -70,6 +73,8 @@ public async Task<IReadOnlyList<ModuleBase>> ExecuteAsync()
7073

7174
await Task.Delay(200);
7275

76+
_moduleLoggerContainer.PrintAllLoggers();
77+
7378
_moduleResultPrinter.PrintModuleResults();
7479
}
7580

ModularPipelines/Host/PipelineHostBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ internal PipelineHostBuilder()
5656
.AddSingleton<IPipelineExecutor, PipelineExecutor>()
5757
.AddSingleton<IModuleExecutor, ModuleExecutor>()
5858
.AddSingleton(typeof(ModuleLogger<>))
59+
.AddSingleton<IModuleLoggerContainer, ModuleLoggerContainer>()
5960
.AddSingleton<IDependencyChainProvider, DependencyChainProvider>()
6061
.AddSingleton<IDependencyDetector, DependencyDetector>()
6162
.AddSingleton<IDependencyCollisionDetector, DependencyCollisionDetector>()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Microsoft.Extensions.Logging;
2+
3+
namespace ModularPipelines;
4+
5+
internal interface IModuleLoggerContainer
6+
{
7+
void PrintAllLoggers();
8+
void AddLogger(ModuleLogger logger);
9+
}

ModularPipelines/ModuleLogger.cs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,16 @@
55

66
namespace ModularPipelines;
77

8-
public class ModuleLogger<T> : ILogger<T>, IDisposable
8+
internal abstract class ModuleLogger : ILogger, IDisposable
9+
{
10+
internal DateTime LastLogWritten { get; set; } = DateTime.MinValue;
11+
public abstract void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter);
12+
public abstract bool IsEnabled(LogLevel logLevel);
13+
public abstract IDisposable BeginScope<TState>(TState state);
14+
public abstract void Dispose();
15+
}
16+
17+
internal class ModuleLogger<T> : ModuleLogger, ILogger<T>, IDisposable
918
{
1019
private readonly IOptions<PipelineOptions> _options;
1120
private readonly ILogger<T> _defaultLogger;
@@ -15,23 +24,24 @@ public class ModuleLogger<T> : ILogger<T>, IDisposable
1524
private bool _isDisposed;
1625

1726
// ReSharper disable once ContextualLoggerProblem
18-
public ModuleLogger(IOptions<PipelineOptions> options, ILogger<T> defaultLogger)
27+
public ModuleLogger(IOptions<PipelineOptions> options, ILogger<T> defaultLogger, IModuleLoggerContainer moduleLoggerContainer)
1928
{
2029
_options = options;
2130
_defaultLogger = defaultLogger;
31+
moduleLoggerContainer.AddLogger(this);
2232
}
2333

24-
public IDisposable BeginScope<TState>(TState state)
34+
public override IDisposable BeginScope<TState>(TState state)
2535
{
2636
return new NoopDisposable();
2737
}
2838

29-
public bool IsEnabled(LogLevel logLevel)
39+
public override bool IsEnabled(LogLevel logLevel)
3040
{
3141
return logLevel >= _options.Value.LoggerOptions.LogLevel;
3242
}
3343

34-
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string>? formatter)
44+
public override void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string>? formatter)
3545
{
3646
if (!IsEnabled(logLevel) || _isDisposed)
3747
{
@@ -43,6 +53,8 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
4353
var valueTuple = (logLevel, eventId, state, exception, mappedFormatter);
4454

4555
_logEvents.Add(valueTuple!);
56+
57+
LastLogWritten = DateTime.UtcNow;
4658
}
4759

4860
private Func<object, Exception?, string> MapFormatter<TState>(Func<TState,Exception?,string>? formatter)
@@ -63,8 +75,13 @@ public void Dispose()
6375
}
6476

6577
[MethodImpl(MethodImplOptions.Synchronized)]
66-
public void Dispose()
78+
public override void Dispose()
6779
{
80+
if (_isDisposed)
81+
{
82+
return;
83+
}
84+
6885
_isDisposed = true;
6986

7087
var logEvents = Interlocked.Exchange(ref _logEvents!, new List<(LogLevel logLevel, EventId eventId, object state, Exception exception, Func<object, Exception?, string> formatter)>());
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Microsoft.Extensions.Logging;
2+
3+
namespace ModularPipelines;
4+
5+
internal class ModuleLoggerContainer : IModuleLoggerContainer
6+
{
7+
private readonly List<ModuleLogger> _loggers = new();
8+
9+
public void PrintAllLoggers()
10+
{
11+
foreach (var logger in _loggers.OrderBy(x => x.LastLogWritten))
12+
{
13+
logger.Dispose();
14+
}
15+
}
16+
17+
public void AddLogger(ModuleLogger logger)
18+
{
19+
_loggers.Add(logger);
20+
}
21+
}

0 commit comments

Comments
 (0)