diff --git a/src/Microsoft.Extensions.Logging.Console/Internal/ConsoleLoggerProcessor.cs b/src/Microsoft.Extensions.Logging.Console/Internal/ConsoleLoggerProcessor.cs index b6b676e3..43efe5cb 100644 --- a/src/Microsoft.Extensions.Logging.Console/Internal/ConsoleLoggerProcessor.cs +++ b/src/Microsoft.Extensions.Logging.Console/Internal/ConsoleLoggerProcessor.cs @@ -27,7 +27,18 @@ public ConsoleLoggerProcessor() public virtual void EnqueueMessage(LogMessageEntry message) { - _messageQueue.Add(message); + if (!_messageQueue.IsAddingCompleted) + { + try + { + _messageQueue.Add(message); + return; + } + catch (InvalidOperationException) { } + } + + // Adding is completed so just log the message + WriteMessage(message); } // for testing diff --git a/test/Microsoft.Extensions.Logging.Test/ConsoleLoggerTest.cs b/test/Microsoft.Extensions.Logging.Test/ConsoleLoggerTest.cs index bfe02d1d..44de8333 100644 --- a/test/Microsoft.Extensions.Logging.Test/ConsoleLoggerTest.cs +++ b/test/Microsoft.Extensions.Logging.Test/ConsoleLoggerTest.cs @@ -769,12 +769,12 @@ public void WriteCore_NullMessageWithException() var expected = ex.ToString() + Environment.NewLine; // Act - logger.Log(LogLevel.Critical, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Error, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Warning, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Information, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Debug, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Trace, 0, message, ex, (s,e) => s); + logger.Log(LogLevel.Critical, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Error, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Warning, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Information, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Debug, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Trace, 0, message, ex, (s, e) => s); // Assert Assert.Equal(6, sink.Writes.Count); @@ -796,12 +796,12 @@ public void WriteCore_MessageWithNullException() Exception ex = null; // Act - logger.Log(LogLevel.Critical, 0, _state, ex, (s,e) => s); - logger.Log(LogLevel.Error, 0, _state, ex, (s,e) => s); - logger.Log(LogLevel.Warning, 0, _state, ex, (s,e) => s); - logger.Log(LogLevel.Information, 0, _state, ex, (s,e) => s); - logger.Log(LogLevel.Debug, 0, _state, ex, (s,e) => s); - logger.Log(LogLevel.Trace, 0, _state, ex, (s,e) => s); + logger.Log(LogLevel.Critical, 0, _state, ex, (s, e) => s); + logger.Log(LogLevel.Error, 0, _state, ex, (s, e) => s); + logger.Log(LogLevel.Warning, 0, _state, ex, (s, e) => s); + logger.Log(LogLevel.Information, 0, _state, ex, (s, e) => s); + logger.Log(LogLevel.Debug, 0, _state, ex, (s, e) => s); + logger.Log(LogLevel.Trace, 0, _state, ex, (s, e) => s); // Assert Assert.Equal(12, sink.Writes.Count); @@ -824,17 +824,35 @@ public void WriteCore_NullMessageWithNullException() string message = null; // Act - logger.Log(LogLevel.Critical, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Error, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Warning, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Information, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Debug, 0, message, ex, (s,e) => s); - logger.Log(LogLevel.Trace, 0, message, ex, (s,e) => s); + logger.Log(LogLevel.Critical, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Error, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Warning, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Information, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Debug, 0, message, ex, (s, e) => s); + logger.Log(LogLevel.Trace, 0, message, ex, (s, e) => s); // Assert Assert.Equal(0, sink.Writes.Count); } + [Fact] + public void LogAfterDisposeWritesLog() + { + // Arrange + var sink = new ConsoleSink(); + var console = new TestConsole(sink); + var processor = new ConsoleLoggerProcessor(); + var logger = new ConsoleLogger(_loggerName, filter: null, includeScopes: false, loggerProcessor: processor); + logger.Console = console; + + // Act + processor.Dispose(); + logger.LogInformation("Logging after dispose"); + + // Assert + Assert.True(sink.Writes.Count == 2); + } + private string GetMessage(string logLevelString, int eventId, Exception exception) => GetMessage(logLevelString, eventId, _state, exception); @@ -849,9 +867,9 @@ private string GetMessage<TState>(string logLevelString, int eventId, TState sta + _paddingString + ReplaceMessageNewLinesWithPadding(state?.ToString()) + Environment.NewLine - + ( exception != null + + (exception != null ? exception.ToString() + Environment.NewLine - : string.Empty ); + : string.Empty); } private string ReplaceMessageNewLinesWithPadding(string message)