Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,10 @@ public int MaxQueueLength
_maxQueuedMessages = value;
}
}

/// <summary>
/// Enable or disable the message queue behavior. Default false.
/// </summary>
public bool DisableMessageQueue { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Diagnostics.Metrics;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

namespace Microsoft.Extensions.Logging.Console
{
Expand All @@ -16,6 +17,7 @@ internal class ConsoleLoggerProcessor : IDisposable
{
private readonly Queue<LogMessageEntry> _messageQueue;
private volatile int _messagesDropped;
private bool _disableMessageQueue;
private bool _isAddingCompleted;
private int _maxQueuedMessages = ConsoleLoggerOptions.DefaultMaxQueueLengthValue;
public int MaxQueueLength
Expand Down Expand Up @@ -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<LogMessageEntry>();
FullMode = fullMode;
MaxQueueLength = maxQueueLength;
Expand All @@ -78,13 +81,32 @@ 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))
{
WriteMessage(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)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ public ConsoleLoggerProvider(IOptionsMonitor<ConsoleLoggerOptions> options, IEnu
console,
errorConsole,
options.CurrentValue.QueueFullMode,
options.CurrentValue.MaxQueueLength);
options.CurrentValue.MaxQueueLength,
options.CurrentValue.DisableMessageQueue);

ReloadLoggerOptions(options.CurrentValue);
_optionsReloadToken = _options.OnChange(ReloadLoggerOptions);
Expand Down