示例#1
0
        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));
            }
        }
示例#2
0
        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));
            }
        }
示例#3
0
        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));
            }
        }
示例#4
0
        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));
            }
        }
示例#5
0
        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));
            }
        }
示例#6
0
        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));
            }
        }
示例#7
0
        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;
        }
示例#8
0
        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>();
        }