using System; using System.Collections.Concurrent; using Serilog.Core; using Serilog.Events; namespace TINK.Services.Logging { public class MemoryStackSink : ILogEventSink { private readonly IFormatProvider _formatProvider; private static ConcurrentStack _MessageStack = new ConcurrentStack(); /// /// Reads all messages an clears memory stack. /// /// Array of messages. public static string[] PopAllMessages() { int countOfMessages = _MessageStack.Count; if (countOfMessages <= 0) return new string[0]; string[] messages = new string[countOfMessages]; if (_MessageStack.TryPopRange(messages) <= 0) return new string[0]; return messages; } /// /// Clears the message stack. /// public static void ClearMessages() => _MessageStack.Clear(); public MemoryStackSink(IFormatProvider formatProvider) { _formatProvider = formatProvider; } public void Emit(LogEvent logEvent) { var message = logEvent.RenderMessage(_formatProvider); _MessageStack.Push(DateTimeOffset.Now.ToString() + " " + message); } } }