示例#1
0
        /// <summary>
        /// Writes log events to <see cref="System.Console"/>.
        /// </summary>
        /// <param name="sinkConfiguration">Logger sink configuration.</param>
        /// <param name="restrictedToMinimumLevel">The minimum level for
        /// events passed through the sink. Ignored when <paramref name="levelSwitch"/> is specified.</param>
        /// <param name="outputTemplate">A message template describing the format used to write to the sink.
        /// The default is <code>"[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"</code>.</param>
        /// <param name="syncRoot">An object that will be used to `lock` (sync) access to the console output. If you specify this, you
        /// will have the ability to lock on this object, and guarantee that the console sink will not be about to output anything while
        /// the lock is held.</param>
        /// <param name="formatProvider">Supplies culture-specific formatting information, or null.</param>
        /// <param name="levelSwitch">A switch allowing the pass-through minimum level
        /// to be changed at runtime.</param>
        /// <param name="standardErrorFromLevel">Specifies the level at which events will be written to standard error.</param>
        /// <param name="theme">The theme to apply to the styled output. If not specified,
        /// uses <see cref="DefaultKonsoleTheme.Literate"/>.</param>
        /// <param name="applyThemeToRedirectedOutput">Applies the selected or default theme even when output redirection is detected.</param>
        /// <returns>Configuration object allowing method chaining.</returns>
        public static LoggerConfiguration Konsole(
            this LoggerSinkConfiguration sinkConfiguration,
            LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
            string outputTemplate                = DefaultConsoleOutputTemplate,
            IFormatProvider formatProvider       = null,
            LoggingLevelSwitch levelSwitch       = null,
            LogEventLevel?standardErrorFromLevel = null,
            KonsoleTheme theme = null,
            bool applyThemeToRedirectedOutput = false,
            object syncRoot = null,
            ConcurrentWriter concurrentWriter = null)
        {
            if (sinkConfiguration == null)
            {
                throw new ArgumentNullException(nameof(sinkConfiguration));
            }
            if (outputTemplate == null)
            {
                throw new ArgumentNullException(nameof(outputTemplate));
            }

            concurrentWriter ??= new Window(Window.OpenBox("Logs")).Concurrent();

            var appliedTheme = !applyThemeToRedirectedOutput && (System.Console.IsOutputRedirected || System.Console.IsErrorRedirected) ?
                               KonsoleTheme.None :
                               theme ?? DefaultKonsoleThemes.Literate;

            syncRoot ??= DefaultSyncRoot;

            var formatter = new OutputTemplateRenderer(appliedTheme, outputTemplate, formatProvider, concurrentWriter);

            return(sinkConfiguration.Sink(new KonsoleSink(appliedTheme, formatter, standardErrorFromLevel, syncRoot, concurrentWriter), restrictedToMinimumLevel, levelSwitch));
        }
        public MessageTemplateOutputTokenRenderer(KonsoleTheme theme, PropertyToken token, IFormatProvider formatProvider, ConcurrentWriter concurrentWriter)
        {
            _theme = theme ?? throw new ArgumentNullException(nameof(theme));
            _token = token ?? throw new ArgumentNullException(nameof(token));
            bool isLiteral = false, isJson = false;

            if (token.Format != null)
            {
                for (var i = 0; i < token.Format.Length; ++i)
                {
                    if (token.Format[i] == 'l')
                    {
                        isLiteral = true;
                    }
                    else if (token.Format[i] == 'j')
                    {
                        isJson = true;
                    }
                }
            }

            var valueFormatter = isJson
                ? (ThemedValueFormatter) new ThemedJsonValueFormatter(theme, formatProvider, concurrentWriter)
                : new ThemedDisplayValueFormatter(theme, formatProvider, concurrentWriter);

            _renderer = new ThemedMessageTemplateRenderer(theme, valueFormatter, isLiteral, concurrentWriter);
        }
示例#3
0
 public TimestampTokenRenderer(KonsoleTheme theme, PropertyToken token, IFormatProvider formatProvider, ConcurrentWriter concurrentWriter)
 {
     _theme            = theme;
     _token            = token;
     _formatProvider   = formatProvider;
     _concurrentWriter = concurrentWriter;
 }
示例#4
0
 public ThemedMessageTemplateRenderer(KonsoleTheme theme, ThemedValueFormatter valueFormatter, bool isLiteral, ConcurrentWriter concurrentWriter)
 {
     _theme                  = theme ?? throw new ArgumentNullException(nameof(theme));
     _valueFormatter         = valueFormatter;
     _isLiteral              = isLiteral;
     _concurrentWriter       = concurrentWriter;
     _unthemedValueFormatter = valueFormatter.SwitchTheme(NoTheme);
 }
示例#5
0
        int RenderValue(KonsoleTheme theme, ThemedValueFormatter valueFormatter, LogEventPropertyValue propertyValue, TextWriter output, string format)
        {
            if (_isLiteral && propertyValue is ScalarValue sv && sv.Value is string)
            {
                var count = 0;
                using (theme.Apply(output, KonsoleThemeStyle.String, ref count, _concurrentWriter))
                    output.Write(sv.Value);
                return(count);
            }

            return(valueFormatter.Format(propertyValue, output, format, _isLiteral));
        }
示例#6
0
 public KonsoleSink(
     KonsoleTheme theme,
     ITextFormatter formatter,
     LogEventLevel?standardErrorFromLevel,
     object syncRoot, ConcurrentWriter concurrentWriter)
 {
     _standardErrorFromLevel = standardErrorFromLevel;
     _theme            = theme ?? throw new ArgumentNullException(nameof(theme));
     _formatter        = formatter;
     _syncRoot         = syncRoot ?? throw new ArgumentNullException(nameof(syncRoot));
     _concurrentWriter = concurrentWriter;
     _writer           = new KonsoleTextWriter(_concurrentWriter);
 }
示例#7
0
        public OutputTemplateRenderer(KonsoleTheme theme, string outputTemplate, IFormatProvider formatProvider, ConcurrentWriter concurrentWriter)
        {
            if (outputTemplate == null)
            {
                throw new ArgumentNullException(nameof(outputTemplate));
            }
            var template = new MessageTemplateParser().Parse(outputTemplate);

            var renderers = new List <OutputTemplateTokenRenderer>();

            foreach (var token in template.Tokens)
            {
                if (token is TextToken tt)
                {
                    renderers.Add(new TextTokenRenderer(theme, tt.Text, concurrentWriter));
                    continue;
                }

                var pt = (PropertyToken)token;
                if (pt.PropertyName == OutputProperties.LevelPropertyName)
                {
                    renderers.Add(new LevelTokenRenderer(theme, pt, concurrentWriter));
                }
                else if (pt.PropertyName == OutputProperties.NewLinePropertyName)
                {
                    renderers.Add(new NewLineTokenRenderer(pt.Alignment));
                }
                else if (pt.PropertyName == OutputProperties.ExceptionPropertyName)
                {
                    renderers.Add(new ExceptionTokenRenderer(theme, pt, concurrentWriter));
                }
                else if (pt.PropertyName == OutputProperties.MessagePropertyName)
                {
                    renderers.Add(new MessageTemplateOutputTokenRenderer(theme, pt, formatProvider, concurrentWriter));
                }
                else if (pt.PropertyName == OutputProperties.TimestampPropertyName)
                {
                    renderers.Add(new TimestampTokenRenderer(theme, pt, formatProvider, concurrentWriter));
                }
                else if (pt.PropertyName == "Properties")
                {
                    renderers.Add(new PropertiesTokenRenderer(theme, pt, template, formatProvider, concurrentWriter));
                }
                else
                {
                    renderers.Add(new EventPropertyTokenRenderer(theme, pt, formatProvider, concurrentWriter));
                }
            }

            _renderers = renderers.ToArray();
        }
示例#8
0
        public PropertiesTokenRenderer(KonsoleTheme theme, PropertyToken token, MessageTemplate outputTemplate, IFormatProvider formatProvider, ConcurrentWriter concurrentWriter)
        {
            _outputTemplate = outputTemplate;
            _theme          = theme ?? throw new ArgumentNullException(nameof(theme));
            _token          = token ?? throw new ArgumentNullException(nameof(token));
            var isJson = false;

            if (token.Format != null)
            {
                for (var i = 0; i < token.Format.Length; ++i)
                {
                    if (token.Format[i] == 'j')
                    {
                        isJson = true;
                    }
                }
            }

            _valueFormatter = isJson
                ? (ThemedValueFormatter) new ThemedJsonValueFormatter(theme, formatProvider, concurrentWriter)
                : new ThemedDisplayValueFormatter(theme, formatProvider, concurrentWriter);
        }
示例#9
0
 public ExceptionTokenRenderer(KonsoleTheme theme, PropertyToken pt, ConcurrentWriter concurrentWriter)
 {
     _theme            = theme;
     _concurrentWriter = concurrentWriter;
 }
示例#10
0
 public LevelTokenRenderer(KonsoleTheme theme, PropertyToken levelToken, ConcurrentWriter concurrentWriter)
 {
     _theme            = theme;
     _levelToken       = levelToken;
     _concurrentWriter = concurrentWriter;
 }
示例#11
0
 public abstract ThemedValueFormatter SwitchTheme(KonsoleTheme theme);
示例#12
0
 protected ThemedValueFormatter(KonsoleTheme theme, ConcurrentWriter concurrentWriter)
 {
     _theme            = theme ?? throw new ArgumentNullException(nameof(theme));
     _concurrentWriter = concurrentWriter;
 }
示例#13
0
 public override ThemedValueFormatter SwitchTheme(KonsoleTheme theme)
 {
     return(new ThemedJsonValueFormatter(theme, _formatProvider, _concurrentWriter));
 }
示例#14
0
 public ThemedJsonValueFormatter(KonsoleTheme theme, IFormatProvider formatProvider, ConcurrentWriter concurrentWriter)
     : base(theme, concurrentWriter)
 {
     _displayFormatter = new ThemedDisplayValueFormatter(theme, formatProvider, concurrentWriter);
     _formatProvider   = formatProvider;
 }
示例#15
0
 public TextTokenRenderer(KonsoleTheme theme, string text, ConcurrentWriter concurrentWriter)
 {
     _theme            = theme;
     _text             = text;
     _concurrentWriter = concurrentWriter;
 }