如何在spdlog中使用' '覆盖输出而非自动换行?
解决spdlog日志覆盖输出问题
要实现用新消息覆盖旧消息的效果,核心是去掉spdlog自动添加的换行符,同时在日志内容开头加入\r控制光标回到行首。以下是具体实现步骤:
1. 修改spdlog日志格式,移除默认换行
spdlog的默认格式化器会自动在每条日志末尾追加换行符(\n),你需要自定义日志模式,只输出消息内容本身,不带日期、级别、换行等额外信息。
代码示例:
// 初始化控制台logger并设置自定义格式 auto console_logger = spdlog::stdout_color_mt("frame_logger"); // %v 仅输出日志内容,无任何附加格式或换行 console_logger->set_pattern("%v");
如果使用全局默认logger,直接修改全局格式即可:
spdlog::set_pattern("%v");
2. 在日志开头加\r,并开启即时刷新
每次输出调试信息时,在消息开头加入\r(回车符,让光标回到当前行首),同时关闭spdlog的缓冲机制,确保日志立即输出,避免覆盖延迟。
代码示例:
// 开启即时刷新,每条日志都直接输出到控制台 console_logger->flush_on(spdlog::level::info); // 模拟帧循环输出 int frame_count = 0; float fps = 0.0f; while (is_running) { // 更新帧数据逻辑... frame_count++; fps = calculate_fps(); // 用\r覆盖上一行内容 console_logger->info("\r当前帧: {} | FPS: {:.2f}", frame_count, fps); }
为什么之前的std::cout << '\r'无效?
spdlog的输出流(默认指向stdout)虽和std::cout共用控制台,但spdlog会先将日志写入内部缓冲区,且默认带换行符。当spdlog输出带换行的日志后,光标已跳至下一行,此时std::cout << '\r'只能回到当前空行的开头,无法覆盖之前的日志行,因此没有效果。
内容的提问来源于stack exchange,提问作者Mustafa Al-Ali
相关产品推荐
相关产品推荐

