You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serilog报System.IndexOutOfRangeException异常,常量日志输出问题求助

Serilog日志打印触发IndexOutOfRangeException的原因及解决办法

问题场景

定义日志打印常量并使用Serilog打印日志,代码如下:

// 注意:此处常量定义语法有误
string const AppMessages.Infos.StartEnqueueProcess = "Starting proccess";
_logger.LogInformation(AppMessages.Infos.StartEnqueueProcess);

运行时抛出异常:System.IndexOutOfRangeException: Index was outside the bounds of the array

原因分析

  1. Serilog结构化日志解析逻辑:Serilog的LogInformation等方法的第一个参数是消息模板,会自动解析字符串中的占位符(如{Property}、{0}格式),并尝试用后续传入的参数填充。如果日志字符串里意外包含未闭合的{/},或者有占位符但未传入对应参数,Serilog解析时会因找不到匹配参数触发数组越界异常。
  2. 常量定义语法错误:string const AppMessages.Infos.StartEnqueueProcess不符合C#语法规则,正确的常量定义需要放在类/结构体内部,且修饰符顺序应为const string而非string const。

解决方法

1. 修正常量定义语法

先确保常量能正常编译,示例代码:

public static class AppMessages
{
    public static class Infos
    {
        public const string StartEnqueueProcess = "Starting process";
    }
}

2. 避免Serilog将消息解析为模板

如果不需要结构化日志,有两种处理方式:

  • 将消息作为参数传入,用占位符包裹整个内容:
    _logger.LogInformation("{Message}", AppMessages.Infos.StartEnqueueProcess);
    
  • 如果消息本身需要包含{或},需转义为{{和}},比如消息是Starting {Enqueue},要写成:
    public const string StartEnqueueProcess = "Starting {{Enqueue}}";
    

3. 规范使用结构化日志(可选)

如果需要结构化日志,直接在模板中定义占位符并传入对应参数,示例:

public const string StartEnqueueProcess = "Starting process: {ProcessName}";
_logger.LogInformation(AppMessages.Infos.StartEnqueueProcess, "Enqueue");

内容的提问来源于stack exchange,提问作者Olaff Velazquez Escalante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:12:10