2015-06-18 50 views
3

我想向Serilog添加動態自定義屬性,但我不知道如何以我想要的方式執行此操作。以下是代碼:Serilog ForContext和自定義屬性

if (data.Exception != null) 
     { 
      _logger.ForContext("Exception", data.Exception, true); 
     } 

     await Task.Run(() => 
       _logger.ForContext("User", _loggedUser.Id) 
       .Information(ControllerActionsFormat.RequestId_ExecutedAction, data.RequestId, data.ActionName) 
      ); 

但是Exception屬性沒有被保留。我曾嘗試:

  await Task.Run(() => 
      _logger.ForContext("Exception", data.Exception, true) 
       .ForContext("User", _loggedUser.Id) 
       .Information(ControllerActionsFormat.RequestId_ExecutedAction, data.RequestId, data.ActionName) 
      ); 

,它工作正常,但有時我不得不處理數據之前,我可以用它(如含迭代的方法的參數字典)。我對想法持開放態度。

回答

3

您在第一個示例中缺少的內容是跟蹤從ForContext()返回的記錄器。 @ BrianMacKay的例子是做到這一點的一種方式,但你也可以做到很到位,像這樣:

var logger = _logger; 

if (data.Exception != null) 
{ 
    logger = logger.ForContext("Exception", data.Exception, true); 
} 

await Task.Run(() => 
    logger.ForContext("User", _loggedUser.Id) 
      .Information(ControllerActionsFormat.RequestId_ExecutedAction, 
         data.RequestId, data.ActionName)); 
+0

這是否解決傾銷鍵/值對的字典到記錄器的問題? 順便說一句:愛Serilog,我的大部分摩擦似乎是圍繞着使物業按我想要的方式工作。 :) –

+0

這兩個答案的工作。但我會拿第二個。 – leosbrf

2

如果你說你需要遍歷一個鍵/值對,並添加屬性爲每個條目,並且沒有辦法知道這些條目都領先的時候,我想你可以嘗試這樣的事情:

var dictionary = new Dictionary<string, string>(); 
var logger = new LoggerConfiguration().CreateLogger(); 

foreach (var key in dictionary.Keys) 
{ 
    logger = logger.ForContext(key, dictionary[key]); 
} 

return logger; 

我沒有測試這個,但它應該和鏈接一堆.ForContext()調用相同。