Headless CMS and Content Managment Hub
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

73 lines
2.1 KiB

// ==========================================================================
// ConsoleLogProcessor.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace Squidex.Infrastructure.Log.Internal
{
public class ConsoleLogProcessor : IDisposable
{
private readonly IConsole console;
private const int MaxQueuedMessages = 1024;
private readonly BlockingCollection<LogMessageEntry> messageQueue = new BlockingCollection<LogMessageEntry>(MaxQueuedMessages);
private readonly Task outputTask;
public ConsoleLogProcessor()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
console = new WindowsLogConsole();
}
else
{
console = new AnsiLogConsole();
}
outputTask = Task.Factory.StartNew(ProcessLogQueue, this, TaskCreationOptions.LongRunning);
}
public void EnqueueMessage(LogMessageEntry message)
{
messageQueue.Add(message);
}
private void ProcessLogQueue()
{
foreach (var entry in messageQueue.GetConsumingEnumerable())
{
console.WriteLine(entry.Level, entry.Message);
}
}
private static void ProcessLogQueue(object state)
{
var processor = (ConsoleLogProcessor)state;
processor.ProcessLogQueue();
}
public void Dispose()
{
messageQueue.CompleteAdding();
try
{
outputTask.Wait(1500);
}
catch (TaskCanceledException)
{
}
catch (AggregateException ex) when (ex.InnerExceptions.Count == 1 && ex.InnerExceptions[0] is TaskCanceledException)
{
}
}
}
}