2017-04-18 25 views
1

根據Serilog's documentation,可以記錄字典,並且serilog將解構它,包括深入解構對象。解構一個複雜對象的字典

如果是這樣的話,沒有任何人有一個想法,爲什麼預期下面的代碼不起作用:

public class ActionLoggingAttribute : ActionFilterAttribute 
{ 
    private ILogger _logger; 

    public ActionLoggingAttribute(ILogger<ActionLoggingAttribute> logger) 
    { 
     _logger = logger; 
    } 

    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (context.ActionArguments.Count > 0) 
     { 
      _logger.LogInformation("Request parameters: {@parameters}", new Dictionary<string, object>(context.ActionArguments)); 
     } 
    } 
} 

結果如下輸出:

{... "MessageTemplate":"Request parameters: {@parameters}","Properties":{"parameters":"[newCard(key), Namespace.ClassNameInsteadOfTheActualObject(value)]" ...}} 

問題:

  1. 它看起來像一個數組,不像字典。爲什麼?還包含引號。
  2. 爲什麼對象沒有被解構?
+0

大多數C#JSON庫將字典序列化爲一個具有屬性的對象,其中屬性等於字典中的鍵。它比'[{「key」:「someKeyname」,「value」:1234},{...}]更小且更少詳細信息' – Tseng

+0

如果是這樣,我期望它被序列化爲'{「key1」: 「value1」,「key2」:「value2」}'。 在我的情況'newCard'是關鍵,沒有正確序列化的對象是值。就像現在一樣,它看起來就像序列化爲一個數組。 – DotnetProg

+1

這看起來像是_Serilog.Extensions.Logging_適配器(它連接ASP.NET Core的日誌記錄與Serilog提供程序)中的一個錯誤。編寫的代碼應該按照您的預期工作。 –

回答

0

編輯: Serilog筆者只是迴應說,這可能是一個錯誤。

無論如何 - 我最終手動迭代了字典。

下面的代碼,如果有人有興趣:

var paramsMessageToBeLogged = "Request parameters : "; 
var paramsList = new List<object>(); 

foreach (var param in context.ActionArguments) 
{ 
    paramsMessageToBeLogged = paramsMessageToBeLogged + string.Format("{{@{0}}} ", param.Key); 
    paramsList.Add(param.Value); 
} 

_logger.LogInformation(paramsMessageToBeLogged, paramsList.ToArray()); 

如果任何人有更好的建議,那將是巨大的。同時 - 這工作。