2016-02-23 105 views
1

是否可以在程序的GUI中顯示Serilog日誌?我正在對我現有的應用程序進行一些更新。我的程序的一個功能是自動滾動更新時的日誌視圖。是否可以在程序的GUI中顯示Serilog日誌?

我正在用Serilog替換我自己編寫的所有現有日誌代碼。我想知道是否可以在文本框或列表視圖或其他GUI控件中顯示日誌。如果是這樣如何?

目前我正在使用滾動文件接收器。除此之外,我想這樣做。

+0

我認爲你可以......你看過他們的'API docmentation'這是你自己可以肯定'Google'的東西你不覺得..? – MethodMan

+0

我一直在谷歌搜索了一個多小時... – TheColonel26

+0

你怎麼寫日誌,你正在執行什麼關鍵詞搜索..也許你應該使用EventLog,因爲你可以寫一些東西,輕鬆地從日誌中讀取..或者將日誌條目作爲xml存儲在數據庫中.. https://logentries.com/doc/video-tutorials/ – MethodMan

回答

5

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()中隊列的大小是個不錯的主意。

+0

在這個例子中傳遞給IFormatProvider的東西是什麼?我從閱讀源代碼中看到它是用於本地化的。傳遞CultureInfo.InvariantCulture應該工作。 – Matt

相關問題