构造复杂对象的字典

时间:2017-04-18 13:13:09

标签: asp.net-core serilog

根据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. 为什么对象也不会被破坏?

1 个答案:

答案 0 :(得分: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());

如果有人有更好的建议,那就太好了。同时 - 这很有效。