.Net Core LogError报Input string was not in a correct format问题咨询
问题根源
你遇到的报错是ILogger的结构化日志模板解析机制导致的,你的写法存在两个问题:
- 混用了C#字符串插值(
$"")和ILogger的模板格式化逻辑:LogXXX系列方法的第一个参数默认是格式化模板字符串,只要你传入了后续的可变参数,框架就会自动解析模板字符串中的{}为占位符,和后续参数做匹配。你先通过C#插值把内容拼好后,刚好你的异常消息是带{}的JSON字符串,框架会尝试解析这些JSON里的大括号为占位符,自然就抛出Input string was not in a correct format错误。 - 你的原插值写法本身也存在错误,
ex.Message没有被包裹在{}中,就算没有格式化报错,也无法正常输出异常消息内容。
问题解答
1. 是否需要对所有大括号转义?
如果你非要把带{}的内容直接拼到模板字符串里,确实需要把{转义为{{、}转义为}},但这是性价比极低的方案,完全没必要这么做。
2. 是否可以禁用格式化特性?
官方没有提供禁用该特性的开关,结构化模板解析是ILogger的核心设计,用来实现结构化日志存储、后续快速检索过滤,本身是合理的设计,没必要禁用。
正确的实现方案
方案一:使用ILogger原生模板语法(推荐)
不要混用C#字符串插值,直接用ILogger的占位符语法,既能避免大括号解析问题,还能保留结构化日志能力,异常堆栈也会被自动记录:
private void LogException(Exception ex, string funcName) { // {FuncName}、{Message}为ILogger模板占位符,自动和后续参数匹配,不需要手动拼接 _logger.LogError(ex, "Error while executing {FuncName}: {Message}", funcName, ex.Message); // 如果要记录完整的JSON错误返回,直接当参数传入即可,不需要拼到模板中 // 示例:_logger.LogError(ex, "调用接口异常 {FuncName},接口返回:{ApiErrorResult}", funcName, 你的JSON字符串); }
方案二:直接传入拼接完成的字符串
如果你不需要结构化日志能力,就直接把拼接完成的字符串作为唯一参数传入LogXXX方法,不要传后续可变参数,框架就不会触发模板解析逻辑:
private void LogException(Exception ex, string funcName) { // 仅传单个字符串参数,不会触发格式化解析 _logger.LogError($"Error while executing {funcName}: {ex.ToString()}"); }
注意:该方案不会自动记录异常堆栈,需要你手动把ex.ToString()拼入字符串中。
内容的提问来源于stack exchange,提问作者John Boldt
相关产品推荐
相关产品推荐

