public void ThrowDuringProcessLog_ShutsDownGracefully() { var console = new TimesWriteCalledConsole(); var writeThrowingConsole = new WriteThrowingConsole(); var processor = new ConsoleLoggerProcessor( console, writeThrowingConsole, ConsoleLoggerQueueFullMode.Wait, 1024); var formatter = new SimpleConsoleFormatter( new TestFormatterOptionsMonitor <SimpleConsoleFormatterOptions>( new SimpleConsoleFormatterOptions())); var logger = new ConsoleLogger(_loggerName, processor, formatter, null, new ConsoleLoggerOptions() { LogToStandardErrorThreshold = LogLevel.Error }); Assert.Null(logger.Options.FormatterName); UpdateFormatterOptions(logger.Formatter, logger.Options); logger.LogInformation("Process 1st log normally using {DesiredConsole}", nameof(TimesWriteCalledConsole)); logger.LogInformation("Process 2nd log normally using {DesiredConsole}", nameof(TimesWriteCalledConsole)); while (console.TimesWriteCalled != 2) { ; // wait until the logs are processed } Assert.Equal(2, console.TimesWriteCalled); logger.LogError("Causing exception to throw in {ClassName} using {DesiredConsole}", nameof(ConsoleLoggerProcessor), nameof(WriteThrowingConsole)); logger.LogInformation("After the write logic threw exception, {ClassName} stopped gracefully, no longer processing next logs", nameof(ConsoleLoggerProcessor)); Assert.Equal(2, console.TimesWriteCalled); }
public void CheckForNotificationWhenQueueIsFull(bool okToDrop) { // Arrange var sink = new ConsoleSink(); var console = new TestConsole(sink); var errorConsole = new TimesWriteCalledConsole(); string queueName = nameof(CheckForNotificationWhenQueueIsFull) + (okToDrop ? "InDropWriteMode" : "InWaitMode"); var fullMode = okToDrop ? ConsoleLoggerQueueFullMode.DropWrite : ConsoleLoggerQueueFullMode.Wait; var processor = new ConsoleLoggerProcessor(console, errorConsole, fullMode, maxQueueLength: 1); var formatter = new SimpleConsoleFormatter(new TestFormatterOptionsMonitor <SimpleConsoleFormatterOptions>( new SimpleConsoleFormatterOptions())); var logger = new ConsoleLogger(_loggerName, processor, formatter, null, new ConsoleLoggerOptions()); Assert.Null(logger.Options.FormatterName); UpdateFormatterOptions(logger.Formatter, logger.Options); string messageTemplate = string.Join(", ", Enumerable.Range(1, 100).Select(x => "{A" + x + "}")); object[] messageParams = Enumerable.Range(1, 100).Select(x => (object)x).ToArray(); // Act for (int i = 0; i < 20000; i++) { logger.LogInformation(messageTemplate, messageParams); } // Assert if (okToDrop) { Assert.True(errorConsole.TimesWriteCalled > 0); } else { Assert.Equal(0, errorConsole.TimesWriteCalled); } }