A renderer for the text tokens.
Beispiel #1
0
    /// <summary>
    /// Initializes a new instance of the <see cref="OutputTemplateRenderer"/> class.
    /// </summary>
    /// <param name="outputTemplate">The output template.</param>
    /// <param name="options">The options.</param>
    internal OutputTemplateRenderer(string outputTemplate, TelegramSinkOptions options)
    {
        MessageTemplate template      = new MessageTemplateParser().Parse(outputTemplate);
        var             renderActions = new List <Action <ExtendedLogEvent, TextWriter> >();

        foreach (MessageTemplateToken token in template.Tokens)
        {
            switch (token)
            {
            case TextToken textToken:
                renderActions.Add((_, w) => TextTokenRenderer.Render(textToken, w, options));
                break;

            case PropertyToken propertyToken:
                switch (propertyToken.PropertyName)
                {
                case OutputProperties.LevelPropertyName:
                    renderActions.Add(new LogLevelRenderer(propertyToken).Render);
                    break;

                case OutputProperties.NewLinePropertyName:
                    renderActions.Add((_, w) => w.WriteLine());
                    break;

                case OutputProperties.ExceptionPropertyName:
                    renderActions.Add(new ExceptionRenderer(options).Render);
                    break;

                case OutputProperties.MessagePropertyName:
                    renderActions.Add(new MessageRenderer(options).Render);
                    break;

                case OutputProperties.TimestampPropertyName:
                    renderActions.Add(new TimestampRenderer(propertyToken).Render);
                    break;

                default:
                    renderActions.Add(new DefaultPropertyRenderer(propertyToken).Render);
                    break;
                }

                break;
            }
        }

        this.renderActions = renderActions.ToArray();
    }
    /// <inheritdoc cref="IPropertyRenderer"/>
    public void Render(ExtendedLogEvent logEvent, TextWriter output)
    {
        using var writer = new StringWriter(new StringBuilder());

        foreach (MessageTemplateToken token in logEvent.LogEvent.MessageTemplate.Tokens)
        {
            switch (token)
            {
            case TextToken textToken:
                TextTokenRenderer.Render(textToken, output, options);
                break;

            case PropertyToken propertyToken:
                new DefaultPropertyRenderer(propertyToken).Render(logEvent, writer);
                break;
            }
        }

        output.Write(HtmlEscaper.Escape(options, writer.ToString()));
    }