spdlog 是轻量高性能 C++ 日志库,支持同步/异步、多线程安全及多种输出目标,头文件直连或 CMake 快速集成,提供控制台、文件、滚动、每日日志器,可自定义格式、级别与刷新策略。

spdlog 是一个轻量、高性能的 C++ 日志库,支持同步/异步日志、多线程安全、多种输出目标(控制台、文件、滚动文件等),且无需依赖 Boost 或其他重型库。它开箱即用,适合嵌入式到服务端各类项目。
快速集成:头文件直连或 CMake 引入
最简单方式是直接使用 header-only 模式:
- 从 GitHub 仓库 下载
include/spdlog目录,放入项目 include 路径 - 在源文件中
#include即可开始使用
推荐 CMake 方式(更利于依赖管理和异步支持):
find_package(spdlog REQUIRED) target_link_libraries(your_target PRIVATE spdlog::spdlog)
注意:若需异步日志,CMake 构建时要确保启用线程支持(默认开启),且链接 spdlog::spdlog_async。
立即学习“C++免费学习笔记(深入)”;
基础日志器创建与使用
spdlog 提供多种预设日志器,常用如下:
-
spdlog::stdout_logger_mt("console"):多线程安全的控制台日志器 -
spdlog::basic_logger_mt("file", "logs/app.log"):写入单个文件 -
spdlog::rotating_logger_mt("rotate", "logs/app.log", 1024*1024, 5):自动滚动(最大 1MB × 5 个备份)
使用示例:
auto console = spdlog::stdout_logger_mt("console");
console->info("Hello {}", "World"); // 格式化输出(类似 fmt)
console->warn("Something went wrong");
console->error("Error code: {}", 404);
启用异步日志:提升高并发写入性能
同步日志在高频调用时可能阻塞主线程;异步模式将日志消息推入队列,由独立线程批量写入,显著降低延迟。
- 创建异步日志器:
auto async_file = spdlog::basic_logger_mt("async_file", "logs/async.log");
async_file->flush_on(spdlog::level::info);
auto async_logger = spdlog::async_logger("async", std::move(async_file), spdlog::thread_pool()); - 更简洁方式(推荐):
auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30); // 每天 2:30 滚动默认就是异步的(若已初始化 thread pool) - 全局线程池只需初始化一次:
spdlog::init_thread_pool(8192, 1); // 队列大小 8192,1 个工作线程
自定义格式、级别与行为
spdlog 默认格式为 [HH:MM:SS.NNN] [level] [logger_name] message,可轻松修改:
- 设置全局格式:
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%n] %v"); - 为特定日志器设格式:
console->set_pattern("[%^%l%$] %v"); - 调整日志级别:
console->set_level(spdlog::level::debug);(支持 trace/debug/info/warn/error/critical/off) - 启用自动刷新(尤其对文件日志):
file_logger->flush_on(spdlog::level::err);
提示:生产环境建议关闭 debug/trace 级别,避免性能损耗;可通过宏控制编译期过滤,如 #define SPDLOG_COMPILED_LIB + 静态链接进一步减小体积。
基本上就这些。spdlog 上手快、配置灵活、性能扎实,合理搭配异步+滚动+级别控制,就能支撑大多数 C++ 项目的日志需求。










