根据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)]" ...}}
问题:
答案 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());
如果有人有更好的建议,那就太好了。同时 - 这很有效。