2017-04-18 8 views
1

Gemäß Serilog's documentation ist es möglich, ein Wörterbuch zu protokollieren, und serilog wird es destrukturieren, einschließlich der detaillierten Destrukturierung von Objekten.Destrukturieren eines Wörterbuchs komplexer Objekte

Wenn das der Fall ist, hat jemand eine Idee, warum der folgende Code als nicht erwartet:

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

Ergebnisse in der folgenden Ausgabe:

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

Fragen:

  1. Es sieht aus wie ein Array, nicht wie ein Wörterbuch. Warum? Es enthält auch Anführungszeichen.
  2. Warum wird das Objekt auch nicht destrukturiert?
+0

Die meisten C# JSON-Bibliotheken serialisieren ein Wörterbuch in ein Objekt mit Eigenschaften, wobei eine Eigenschaft einem Schlüssel im Wörterbuch entspricht. Es ist kleiner und weniger ausführlich als '[{" key ":" someKeyname "," value ": 1234}, {...}]' – Tseng

+0

Wenn ja, würde ich erwarten, dass es als '{" key1 "serialisiert wird: "Wert1", "Schlüssel2": "Wert2"} '. In meinem Fall ist 'newCard' der Schlüssel und das Objekt wird nicht richtig serialisiert. Wie es jetzt aussieht, sieht es so aus, als wäre es als Array serialisiert worden. – DotnetProg

+1

Das sieht verdächtig wie ein Fehler im Adapter _Serilog.Extensions.Logging_ aus (der die Protokollierung von ASP.NET Core mit dem Serilog-Provider verbindet). Der Code sollte wie erwartet funktionieren. –

Antwort

0

EDIT: Der Autor von Serilog antwortete nur, dass es ein Fehler sein könnte.

Wie auch immer - ich habe schließlich das Wörterbuch manuell durchlaufen.

Hier ist der Code, wenn jemand interessiert ist:

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

Wenn jemand einen besseren Vorschlag hat, das wird groß sein. Inzwischen - das funktioniert.

Verwandte Themen