MS Extensions Logging“LogError”方法抛出异常“索引(基于零)必须大于或等于零”?

Posted

技术标签:

【中文标题】MS Extensions Logging“LogError”方法抛出异常“索引(基于零)必须大于或等于零”?【英文标题】:MS Extensions Logging "LogError" method is throwing exception "Index (zero based) must be greater than or equal to zero"? 【发布时间】: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 方法参数需要 args LogError(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。如果消息中没有属性漏洞,它就无法实际粘贴添加的信息,因此会出现异常 【参考方案1】:

下面似乎对我来说工作正常:

    string SomeConstant = "Constant Value";
    try
    
        int x = 1; int y = 0;
        int a = x / y;
        //Some Code
    
    catch (Exception ex)
    
        log.LogInformation("!!!!!!!!!!!!!!!!");
        log.LogError(ex,@"0 1 2",SomeConstant, string.Empty, string.Empty);
        log.LogInformation("!!!!!!!!!!!!!!!!");
    

【讨论】:

以上是关于MS Extensions Logging“LogError”方法抛出异常“索引(基于零)必须大于或等于零”?的主要内容,如果未能解决你的问题,请参考以下文章

NetCore 使用Log4Net

无法从 Microsoft.Extensions.Logging 解析 ILogger

无法解析类型“Microsoft.Extensions.Logging.ILogger`1[WebApplication1.Startup]”的服务

nuget 没有使用 nuget 包中为 Microsoft.Extensions.Logging 指定的内容解决依赖关系

(VIP-朝夕教育)2021-06-06 .NET高级班 41-ASP.NET Core log4.net日志框架的使用

如何使用 LoggerFactory 和 Microsoft.Extensions.Logging 使用 C# 进行 .NET Core 控制台日志记录