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
原因分析
- Serilog结构化日志解析逻辑:Serilog的
LogInformation等方法的第一个参数是消息模板,会自动解析字符串中的占位符(如{Property}、{0}格式),并尝试用后续传入的参数填充。如果日志字符串里意外包含未闭合的{/},或者有占位符但未传入对应参数,Serilog解析时会因找不到匹配参数触发数组越界异常。 - 常量定义语法错误:
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
相关产品推荐
相关产品推荐

