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);