You need to enable JavaScript to run this app. SPDLOG_LOGGER_CALL宏可变参数未完成日志格式化问题求助
优惠活动
大模型
产品
解决方案
定价
更多

SPDLOG_LOGGER_CALL宏可变参数未完成日志格式化问题求助

问题原因与解决方案

核心原因

spdlog默认采用fmt库的花括号格式化语法,而非C语言printf风格的百分号占位符。你传入的%d %s被fmt引擎识别为普通文本,直接原样输出,没有触发参数替换逻辑。

SPDLOG_LOGGER_CALL 运行逻辑

该宏是spdlog提供的通用日志打印封装,和SPDLOG_LOGGER_INFO等级别固定的宏实现逻辑完全一致,唯一区别是支持手动指定日志级别。运行时它会自动采集当前代码的文件名、行号等上下文信息,再将你传入的格式串、可变参数统一转发给logger实例的log方法,由底层fmt引擎完成格式化后输出。

修复方案

方案1(推荐):改用fmt格式语法

将格式串替换为fmt支持的{}占位符即可,不需要修改其他参数,std::string类型可直接传入:

// 修改前
// SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "%d %s", i, msg);
// 修改后
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{} {}", i, msg);

方案2:保留printf风格语法

如果必须使用百分号占位符,需要做两处修改:

  1. 格式串用spdlog::fmt_lib::printf包裹,启用printf格式解析逻辑
  2. std::string类型需要调用c_str()方法转为C风格字符串,匹配%s占位符要求:
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, spdlog::fmt_lib::printf("%d %s"), i, msg.c_str());

内容的提问来源于stack exchange,提问作者flashburn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 18:18:03