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风格语法
如果必须使用百分号占位符,需要做两处修改:
- 格式串用
spdlog::fmt_lib::printf包裹,启用printf格式解析逻辑 - 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
相关产品推荐
相关产品推荐

