55
66namespace 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 ) > ( ) ) ;
0 commit comments