diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerOptions.cs b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerOptions.cs index 69704e4095a8eb..16254949aac643 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerOptions.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerOptions.cs @@ -100,5 +100,10 @@ public int MaxQueueLength _maxQueuedMessages = value; } } + + /// + /// Enable or disable the message queue behavior. Default false. + /// + public bool DisableMessageQueue { get; set; } } } diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProcessor.cs b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProcessor.cs index 8426f51c17d601..7afc816755d977 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProcessor.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProcessor.cs @@ -8,6 +8,7 @@ using System.Diagnostics.Metrics; using System.Runtime.Versioning; using System.Threading; +using System.Threading.Tasks; namespace Microsoft.Extensions.Logging.Console { @@ -16,6 +17,7 @@ internal class ConsoleLoggerProcessor : IDisposable { private readonly Queue _messageQueue; private volatile int _messagesDropped; + private bool _disableMessageQueue; private bool _isAddingCompleted; private int _maxQueuedMessages = ConsoleLoggerOptions.DefaultMaxQueueLengthValue; public int MaxQueueLength @@ -60,8 +62,9 @@ public ConsoleLoggerQueueFullMode FullMode public IConsole Console { get; } public IConsole ErrorConsole { get; } - public ConsoleLoggerProcessor(IConsole console, IConsole errorConsole, ConsoleLoggerQueueFullMode fullMode, int maxQueueLength) + public ConsoleLoggerProcessor(IConsole console, IConsole errorConsole, ConsoleLoggerQueueFullMode fullMode, int maxQueueLength, bool disableMessageQueue = false) { + _disableMessageQueue = disableMessageQueue; _messageQueue = new Queue(); FullMode = fullMode; MaxQueueLength = maxQueueLength; @@ -78,6 +81,12 @@ public ConsoleLoggerProcessor(IConsole console, IConsole errorConsole, ConsoleLo public virtual void EnqueueMessage(LogMessageEntry message) { + if (_disableMessageQueue) + { + DirectWriteMessage(message); + return; + } + // cannot enqueue when adding is completed if (!Enqueue(message)) { @@ -85,6 +94,19 @@ public virtual void EnqueueMessage(LogMessageEntry message) } } + internal void DirectWriteMessage(LogMessageEntry entry) + { + _ = Task.Factory.StartNew(() => + { + try + { + IConsole console = entry.LogAsError ? ErrorConsole : Console; + console.Write(entry.Message); + } + catch (Exception) { } //Ignore to protect application + }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); + } + // internal for testing internal void WriteMessage(LogMessageEntry entry) { diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProvider.cs b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProvider.cs index 8551e74056f4c9..02d5f65313d21e 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProvider.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerProvider.cs @@ -59,7 +59,8 @@ public ConsoleLoggerProvider(IOptionsMonitor options, IEnu console, errorConsole, options.CurrentValue.QueueFullMode, - options.CurrentValue.MaxQueueLength); + options.CurrentValue.MaxQueueLength, + options.CurrentValue.DisableMessageQueue); ReloadLoggerOptions(options.CurrentValue); _optionsReloadToken = _options.OnChange(ReloadLoggerOptions);