【发布时间】:2021-08-13 10:54:54
【问题描述】:
“Microsoft.Extensions.Logging.LoggerExtensions.LogError”正在抛出异常
索引(从零开始)必须大于或等于零且小于 参数列表的大小。
代码:
string SomeConstant = "Constant Value";
try
{
//Some Code
}
catch (Exception ex)
{
logger.LogError(ex, ex.Message + " {ValueOne} {ValueTwo} {ValueThree} ", SomeConstant, string.Empty, string.Empty);
return false;
}
LogError 方法所需的所有参数都在函数调用期间传递。
组装
Microsoft.Extensions.Logging.Abstractions
版本
2.2.0.0
提前致谢!
【问题讨论】:
-
使用这些附加参数
, SomeConstant, string.Empty, string.Empty调用 LogError 方法的原因是什么?LogError方法参数需要 argsLogError(this ILogger logger, Exception exception, string message, params object[] args);并且这些参数将用于传递参数化消息。但在你的情况下,字符串没有参数化 -
我们需要记录三个附加信息(与业务需求相关),因此需要附加参数。
-
将这些添加为参数化字符串,如
logger.LogError(ex, $" Message: ex.Message , Another String: Some string, param1 : {0}, param2 : {1}, param3: {3}", SomeConstant, string.Empty, string.Empty)。相应地更改参数名称。您还可以对这些附加参数使用结构日志记录。 -
记录器方法期望传递给它的任何附加参数在消息模板中具有相应的格式“漏洞”。当您传递参数并且没有任何
{Properties}时,记录器将失败,因为它找不到任何具有与数组中添加的参数索引相对应的索引的孔。将属性添加到消息模板中,或者将您的属性添加为记录器范围数据(或任何您的底层记录框架——如果不是 MS——用于添加额外信息,例如 Serilog 的日志上下文) -
而具体原因是因为 MS.Extensions.Logging 被设计为通用的,同时还支持结构化 Logging。因此,参数数组中传递的值必须在消息模板中具有相应的属性。如果您不使用结构化日志记录(例如 Serilog),那么日志记录框架最终会非常接近调用
string.Format。如果消息中没有属性漏洞,它就无法实际粘贴添加的信息,因此会出现异常
标签: c# .net azure-functions microsoft.extensions.logging