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

时间:2016-02-23 02:42:49

标签: c# .net serilog

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

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

3 个答案:

答案 0 :(得分:7)

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());
    }
}

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

var sink = new InMemorySink();
Log.Logger = new LoggerConfiguration()
    .WriteTo.Sink(sink)
    .CreateLogger();

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

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

答案 1 :(得分:2)

您可以使用Serilog.Sinks.TextWriter

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

T

结果;

enter image description here

答案 2 :(得分:0)

现在有一个专门用于登录 WPF 文本框的接收器:Serilog.Sinks.WPF