2016-03-07 206 views
1

我寫了一個使用Log4Net,Nlog和Serilog交替使用的日誌框架。每次調用記錄器,都會在寫入日誌條目之前觸發事件。這可以選擇通過SignalR將條目推送到連接的Web客戶端。Serilog - 如何將格式化消息手動呈現爲字符串?

在添加serilog之前,我使用string.Format來獲取格式化文本。現在這個偉大的解構已經成爲了重大的責任。 string.Format顯然不喜歡字符串中的{@ 0}或{data}。

// log the event before engaging with the logger 
LogEventBus.Handle(LogLevels.Info, DateTime.Now, msg, args); 
if (DiagnosticLevel < level) 
    return; 
_logger.Info(msg, args); 

有沒有什麼辦法讓serilog生成輸出,直接作爲字符串?

我開始寫一個內存接收器,但是這遠離了我基於集中事件的日誌記錄,並且完全脫離了我實現的其他庫。

有什麼建議嗎?

+0

這會有幫助嗎? https://github.com/adamchester/MessageTemplates –

回答

3

可以Serilog的消息格式轉換成標準的.NET格式字符串({0}等)是這樣的:

var parser = new MessageTemplateParser(); 
var template = parser.Parse(template); 
var format = new StringBuilder(); 
var index = 0; 
foreach (var tok in template.Tokens) 
{ 
    if (tok is TextToken) 
     format.Append(tok); 
    else 
     format.Append("{" + index++ + "}"); 
} 
var netStyle = format.ToString(); 

一旦你有一個標準的格式字符串,你可以通過傳遞這樣或使用string.Format()與它args

這不會是超高效的 - 更深入到Serilog pipleine(ILogEventEnricher)應該更好。正如另一位評論者所說,在這裏採用單一的日誌框架可能會更好。

+0

謝謝。我有一個沒有日誌實現的基礎庫。它已被用於超過7個大型應用程序。它只有其他庫可以調用的記錄器。最重要的是,我有一個庫,每個都有一個日誌記錄實現。某些應用程序無法修改以刪除log4net或NLog。 Serilog的新增功能(感謝dotnetrocks),框架已經相當成熟。 – reckface

+0

它的工作原理。發佈到SignalR功能是一項額外的功能,並且日誌事件總線是異步運行的,所以除了瀏覽器上的去抖動設置之外,獲取信息的延遲是可以接受的。謝謝 – reckface

0

分兩步進行登錄。

  1. 寫日誌消息,一個TextWriter從 的TextWriter (https://github.com/serilog/serilog/wiki/Provided-Sinks#textwriter
  2. 寫的已經格式化值到真實記錄

雖然這可能會奏效讀出的值,我擔心你的建築在這裏。這聽起來像是你正在創造對Serilog的巨大依賴,而你也在使用其他幾個日誌frmeworks。選擇一個日誌框架或使用真正的通用功能。 C#已經引入了字符串插值,不像Serilogs序列化那樣花哨,但工作正常。我會回到KISS。

+0

是的,我也擔心,但事實並非如此。我在LogEvent ...程序集中沒有日誌庫,它只是通用的日誌接口,當您選擇這些接口的實現時選擇日誌庫 – reckface

相關問題