是否可以在程序的GUI中显示Serilog日志?

The*_*l26 6 .net c# serilog

我正在替换我用Serilog自己编写的所有现有日志记录代码.我想知道是否可以在文本框,列表视图或其他GUI控件中显示日志.如果是这样的话?我的UI是WinForms.

目前,我正在使用滚动文件接收器.除此之外,我想这样做.

Cai*_*ete 13

您可能想查看Serilog.Sinks.RichTextBox接收器,它可以将日志写入RichTextBox带有颜色、格式等的控件,类似于您在控制台应用程序中所期望的(您可以通过主题完全控制颜色)。

Serilog.Sinks.RichTextBox

该接收器最初是为 WPF 应用程序构建的,但也可以轻松地与 Windows 窗体应用程序一起使用,并且存储库中有一个示例演示了如何将其与 Windows 窗体一起使用

免责声明:我是水槽的作者Serilog.Sinks.RichTextBox


Nic*_*rdt 8

Serilog为此提供了ILogEventSink扩展点.您可以使用它将日志事件添加到列表中,或将它们渲染到TextWriter某个位置.

根据您的需要,可能会有不同程度的复杂程度.这个(基于ConsoleSink)应该让你去:

class InMemorySink : ILogEventSink
{
    readonly ITextFormatter _textFormatter = new MessageTemplateTextFormatter("{Timestamp} [{Level}] {Message}{Exception}");

    public ConcurrentQueue<string> Events { get; } = new ConcurrentQueue<string>();

    public void Emit(LogEvent logEvent)
    {
        if (logEvent == null) throw new ArgumentNullException(nameof(logEvent));
        var renderSpace = new StringWriter();
        _textFormatter.Format(logEvent, renderSpace);
        Events.Enqueue(renderSpace.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其挂起意味着创建一个实例:

var sink = new InMemorySink();
Log.Logger = new LoggerConfiguration()
    .WriteTo.Sink(sink)
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

然后,由您的应用程序决定如何在显示时加载sink.Events到文本框中.

添加一些代码以限制队列的大小Emit()是个好主意.

  • **Nicholas Blumhardt:** 如果您能提供一些有关“如何将接收器.Events 加载到文本框中”的指导,那就太好了 (2认同)

Tol*_*kir 6

您可以使用Serilog.Sinks.TextWriter

您可以在多行文本框中显示日志,如下所示;

namespace SerilogSample
{
    public partial class Form1 : Form
    {
        private StringWriter _messages;
        ILogger _logger;
        public Form1()
        {
            InitializeComponent();

            _messages = new StringWriter();
            _logger = new LoggerConfiguration()
                .WriteTo.TextWriter(_messages)
                .CreateLogger();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _logger.Information("Clicked!");
            textBox1.Text = _messages.ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果;

在此输入图像描述