2017-04-18 5 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

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

誰もがより良い提案を持っている場合、それは素晴らしいことでしょう。一方、これは動作します。

関連する問題