gpt4 book ai didi

c# - Serilog 只记录数组的第一个元素

转载 作者:行者123 更新时间:2023-12-04 12:34:05 30 4
gpt4 key购买 nike

我正在使用 Serilog 2.10.0 登录 .NET 5 上的 ASP.NET Core 应用程序。我在尝试记录只有一个参数且此参数是数组的事件时遇到问题。以下是一些示例代码和带有 JSON 文件接收器的日志输出:

var myArray = new string[] { "foo", "bar" };
logger.LogInformation("Log stuff: {@MyArray}", myArray);
{"@t":"2021-02-22T14:09:46.8673482Z","@mt":"Log stuff: {@MyArray}","MyArray":"foo","SourceContext":"MyNamespace.MyClass"}
logger是通过依赖注入(inject)注入(inject)的 ILogger。记录的事件仅包含我的字符串数组的第一个元素。如果我添加另一个参数,则正确记录字符串数组。我在有和没有 @ 的情况下都试过了还有一个不同的水槽。
这是一个带有附加参数的修改示例,它按我的预期工作:
var myArray = new string[] { "foo", "bar" };
logger.LogInformation("Log stuff: {baz} {@MyArray}", "baz", myArray);
{"@t":"2021-02-22T14:19:21.3580354Z","@mt":"Log stuff: {baz} {@MyArray}","baz":"baz","MyArray":["foo","bar"],"SourceContext":"MyNamespace.MyClass"}
我怀疑我在这里误解了可变参数函数如何确定模板字符串中参数和变量之间的映射。但是我想不出一种方法来让它正常工作而不添加不相关的附加参数。
如何让 Serilog 以单个数组作为参数正确处理日志消息?

最佳答案

我能够重现您的问题。 Resharper 标记了问题,如下面的屏幕截图所示。
enter image description here
如果我们输入 LoggerExtensions#LogInformation 的来源,它具有以下签名:

public static void LogInformation(this ILogger logger, string message, params object[] args)
最后一个参数是 params object[] args ,并且当传入单个数组时,此方法认为该数组是一个参数列表并将该数组强制转换为 object[] ,而您的意图是将数组作为参数传入。通过像这样更改模板来确认这一点:
_logger.LogInformation("Log stuff: {FirstElement} {SecondElement}", myArray); 
这将输出 Log stuff: foo bar .上面的代码具有与此相同的逻辑和行为:
_logger.LogInformation("Log stuff: {FirstElement} {SecondElement}", "foo", "bar");
将数组更改为例如一个列表,或者,正如@IharYakimush 所建议的,简单地将数组转换为 object , 之所以有用,是因为该集合现在将被视为参数,而不是参数列表。
_logger.LogInformation("Log stuff: {MyArray}", (object)myArray);

关于c# - Serilog 只记录数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66317482/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com