public void WritingNestedScopes_LogsExpectedMessage(ConsoleLoggerFormat format) { // Arrange var t = SetUp(new ConsoleLoggerOptions { IncludeScopes = true, Format = format }); var logger = t.Logger; var sink = t.Sink; var level = LogLevel.Information; var levelPrefix = t.GetLevelPrefix(level); var header = CreateHeader(format); var scope = "=> RequestId: 100 => Request matched action: Index"; var message = _state; // Act using (logger.BeginScope("RequestId: {RequestId}", 100)) { using (logger.BeginScope("Request matched action: {ActionName}", "Index")) { logger.Log(level, 0, _state, null, _defaultFormatter); } } switch (format) { case ConsoleLoggerFormat.Default: { // Assert Assert.Equal(2, sink.Writes.Count); // scope var write = sink.Writes[1]; Assert.Equal(header + Environment.NewLine + _paddingString + scope + Environment.NewLine + _paddingString + message + Environment.NewLine, write.Message); Assert.Equal(TestConsole.DefaultBackgroundColor, write.BackgroundColor); Assert.Equal(TestConsole.DefaultForegroundColor, write.ForegroundColor); } break; case ConsoleLoggerFormat.Systemd: { // Assert Assert.Single(sink.Writes); // scope var write = sink.Writes[0]; Assert.Equal(levelPrefix + header + " " + scope + " " + message + Environment.NewLine, write.Message); Assert.Null(write.BackgroundColor); Assert.Null(write.ForegroundColor); } break; default: throw new ArgumentOutOfRangeException(nameof(format)); } }
public void ConsoleLoggerLogsToError_WhenOverErrorLevel(ConsoleLoggerFormat format) { // Arrange var t = SetUp(new ConsoleLoggerOptions { LogToStandardErrorThreshold = LogLevel.Warning, Format = format }); var logger = t.Logger; var sink = t.Sink; var errorSink = t.ErrorSink; // Act logger.LogInformation("Info"); logger.LogWarning("Warn"); // Assert switch (format) { case ConsoleLoggerFormat.Default: { Assert.Equal(2, sink.Writes.Count); Assert.Equal( "info: test[0]" + Environment.NewLine + " Info" + Environment.NewLine, GetMessage(sink.Writes)); Assert.Equal(2, errorSink.Writes.Count); Assert.Equal( "warn: test[0]" + Environment.NewLine + " Warn" + Environment.NewLine, GetMessage(errorSink.Writes)); } break; case ConsoleLoggerFormat.Systemd: { Assert.Single(sink.Writes); Assert.Equal( "<6>test[0] Info" + Environment.NewLine, GetMessage(sink.Writes)); Assert.Single(errorSink.Writes); Assert.Equal( "<4>test[0] Warn" + Environment.NewLine, GetMessage(errorSink.Writes)); } break; default: throw new ArgumentOutOfRangeException(nameof(format)); } }
public void WritingNestedScope_LogsNullScopeName(ConsoleLoggerFormat format) { // Arrange var t = SetUp(new ConsoleLoggerOptions { IncludeScopes = true, Format = format }); var logger = t.Logger; var sink = t.Sink; var level = LogLevel.Information; var levelPrefix = t.GetLevelPrefix(level); var header = CreateHeader(format); var scope = "=> [null] => Request matched action: (null)"; var message = _state; // Act using (logger.BeginScope(null)) { using (logger.BeginScope("Request matched action: {ActionName}", new object[] { null })) { logger.Log(level, 0, _state, null, _defaultFormatter); } } // Assert switch (format) { case ConsoleLoggerFormat.Default: { Assert.Equal(2, sink.Writes.Count); // scope var write = sink.Writes[1]; Assert.Equal(header + Environment.NewLine + _paddingString + scope + Environment.NewLine + _paddingString + message + Environment.NewLine, write.Message); } break; case ConsoleLoggerFormat.Systemd: { Assert.Single(sink.Writes); // scope var write = sink.Writes[0]; Assert.Equal(levelPrefix + header + " " + scope + " " + message + Environment.NewLine, write.Message); } break; default: throw new ArgumentOutOfRangeException(nameof(format)); } }
private string CreateHeader(ConsoleLoggerFormat format, int eventId = 0) { switch (format) { case ConsoleLoggerFormat.Default: return($": {_loggerName}[{eventId}]"); case ConsoleLoggerFormat.Systemd: return($"{_loggerName}[{eventId}]"); default: throw new ArgumentOutOfRangeException(nameof(format)); } }
public void WriteCore_NullMessageWithException(ConsoleLoggerFormat format, LogLevel level) { // Arrange var t = SetUp(new ConsoleLoggerOptions { Format = format }); var levelPrefix = t.GetLevelPrefix(level); var logger = t.Logger; var sink = t.Sink; var ex = new Exception("Exception message" + Environment.NewLine + "with a second line"); string message = null; // Act logger.Log(level, 0, message, ex, (s, e) => s); // Assert switch (format) { case ConsoleLoggerFormat.Default: { Assert.Equal(2, sink.Writes.Count); Assert.Equal( levelPrefix + ": test[0]" + Environment.NewLine + "System.Exception: Exception message" + Environment.NewLine + "with a second line" + Environment.NewLine, GetMessage(sink.Writes)); } break; case ConsoleLoggerFormat.Systemd: { Assert.Single(sink.Writes); Assert.Equal( levelPrefix + "test[0]" + " " + "System.Exception: Exception message" + " " + "with a second line" + Environment.NewLine, GetMessage(sink.Writes)); } break; default: throw new ArgumentOutOfRangeException(nameof(format)); } }
public void WriteCore_LogsCorrectMessages(ConsoleLoggerFormat format, LogLevel level) { // Arrange var t = SetUp(new ConsoleLoggerOptions { Format = format }); var levelPrefix = t.GetLevelPrefix(level); var logger = t.Logger; var sink = t.Sink; var ex = new Exception("Exception message" + Environment.NewLine + "with a second line"); // Act logger.Log(level, 0, _state, ex, _defaultFormatter); // Assert switch (format) { case ConsoleLoggerFormat.Default: { Assert.Equal(2, sink.Writes.Count); Assert.Equal( levelPrefix + ": test[0]" + Environment.NewLine + " This is a test, and {curly braces} are just fine!" + Environment.NewLine + "System.Exception: Exception message" + Environment.NewLine + "with a second line" + Environment.NewLine, GetMessage(sink.Writes)); } break; case ConsoleLoggerFormat.Systemd: { Assert.Single(sink.Writes); Assert.Equal( levelPrefix + "test[0]" + " " + "This is a test, and {curly braces} are just fine!" + " " + "System.Exception: Exception message" + " " + "with a second line" + Environment.NewLine, GetMessage(sink.Writes)); } break; default: throw new ArgumentOutOfRangeException(nameof(format)); } }
public virtual void WriteMessage(LogLevel logLevel, string logName, int eventId, string message, Exception exception) { ConsoleLoggerFormat format = Options.Format; Debug.Assert(format >= ConsoleLoggerFormat.Default && format <= ConsoleLoggerFormat.Systemd); StringBuilder logBuilder = _logBuilder; _logBuilder = null; if (logBuilder == null) { logBuilder = new StringBuilder(); } LogMessageEntry entry; if (format == ConsoleLoggerFormat.Default) { entry = CreateDefaultLogMessage(logBuilder, logLevel, logName, eventId, message, exception); } else if (format == ConsoleLoggerFormat.Systemd) { entry = CreateSystemdLogMessage(logBuilder, logLevel, logName, eventId, message, exception); } else { entry = default; } _queueProcessor.EnqueueMessage(entry); logBuilder.Clear(); if (logBuilder.Capacity > 1024) { logBuilder.Capacity = 1024; } _logBuilder = logBuilder; }
public void WriteCore_LogsCorrectTimestamp(ConsoleLoggerFormat format, LogLevel level) { // Arrange var t = SetUp(new ConsoleLoggerOptions { TimestampFormat = "yyyyMMddHHmmss ", Format = format }); var levelPrefix = t.GetLevelPrefix(level); var logger = t.Logger; var sink = t.Sink; var ex = new Exception("Exception message" + Environment.NewLine + "with a second line"); // Act logger.Log(level, 0, _state, ex, _defaultFormatter); // Assert switch (format) { case ConsoleLoggerFormat.Default: { Assert.Equal(3, sink.Writes.Count); Assert.Matches("^\\d{14}\\s$", sink.Writes[0].Message); Assert.StartsWith(levelPrefix, sink.Writes[1].Message); } break; case ConsoleLoggerFormat.Systemd: { Assert.Single(sink.Writes); Assert.Matches("^<\\d>\\d{14}\\s[^\\s]", sink.Writes[0].Message); Assert.StartsWith(levelPrefix, sink.Writes[0].Message); } break; default: throw new ArgumentOutOfRangeException(nameof(format)); } }
private static void AddConsoleLoggerOptionsSubSchema <TOptions>(GenerationContext context, ConsoleLoggerFormat consoleLoggerFormat) { JsonSchema consoleLoggerOptionsSchema = new JsonSchema(); consoleLoggerOptionsSchema.RequiredProperties.Add(nameof(ConsoleLoggerOptions.FormatterName)); JsonSchemaProperty formatterOptionsProperty = AddDiscriminatedSubSchema( context.Schema.Definitions[nameof(ConsoleLoggerOptions)], nameof(ConsoleLoggerOptions.FormatterName), consoleLoggerFormat.ToString(), nameof(ConsoleLoggerOptions.FormatterOptions), consoleLoggerOptionsSchema); formatterOptionsProperty.Reference = context.AddTypeIfNotExist <TOptions>(); }