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

.Net Core LogError报Input string was not in a correct format问题咨询

问题根源

你遇到的报错是ILogger的结构化日志模板解析机制导致的,你的写法存在两个问题:

  1. 混用了C#字符串插值($"")和ILogger的模板格式化逻辑:LogXXX系列方法的第一个参数默认是格式化模板字符串,只要你传入了后续的可变参数,框架就会自动解析模板字符串中的{}为占位符,和后续参数做匹配。你先通过C#插值把内容拼好后,刚好你的异常消息是带{}的JSON字符串,框架会尝试解析这些JSON里的大括号为占位符,自然就抛出Input string was not in a correct format错误。
  2. 你的原插值写法本身也存在错误,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:24:01