spdlog 是 c++ 中主流轻量高效日志库,支持多线程、多输出目标、格式化与等级控制,无需 boost 依赖;支持 header-only 使用,提供控制台、文件、滚动、每日分割等 logger,可自定义格式、级别,具备异步日志与自定义 sink 能力。

在 C++ 项目中做日志记录,spdlog 是目前最主流、轻量又高效的选择。它支持多线程、多种输出目标(控制台、文件、滚动文件)、丰富格式化、等级控制,且无需依赖 Boost 或其他重型库。
快速上手:安装与基础用法
spdlog 是 header-only 库(默认情况下),只需下载头文件即可使用;也可通过包管理器集成:
-
CMake + vcpkg:
vcpkg install spdlog,然后在CMakeLists.txt中find_package(spdlog) -
Conan:
conan install spdlog/1.14.1 -
手动引入:从 GitHub 仓库 下载
include/spdlog目录,加入编译 include 路径
最简示例(控制台日志):
#include "spdlog/spdlog.h"
int main() {
spdlog::info("Hello, {}!", "world"); // INFO 级别
spdlog::warn("This is a warning");
spdlog::error("An error occurred: {}", 404);
return 0;
}
创建不同类型的 logger 实例
全局 logger(如 spdlog::info)方便但不够灵活;实际项目推荐显式创建 logger 对象,便于隔离、复用和配置:
立即学习“C++免费学习笔记(深入)”;
-
控制台 logger:
auto console = spdlog::stdout_logger_mt("console"); -
文件 logger:
auto file = spdlog::basic_logger_mt("file", "logs/app.log"); -
滚动文件 logger(按大小):
auto rotating = spdlog::rotating_logger_mt("rotating", "logs/rotating.txt", 1048576, 5);(单文件最大 1MB,最多保留 5 个旧文件) -
每日分割 logger:
auto daily = spdlog::daily_logger_mt("daily", "logs/daily.txt", 2, 30);(每天 2:30 自动切分)
自定义格式、级别与线程安全
spdlog 默认格式为 [HH:MM:SS] [level] message,可通过 set_pattern() 修改:
auto logger = spdlog::stdout_logger_mt("my_logger");
logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%n] [%^%l%$] %v");
// 输出示例:[2024-05-20 14:22:03.123] [my_logger] [INFO] Hello
日志级别从低到高:trace 。可全局设置最低输出级别:
-
spdlog::set_level(spdlog::level::debug);(影响所有 logger) -
logger->set_level(spdlog::level::warn);(仅该 logger)
所有 _mt(multi-thread)版本 logger 内置线程安全,无需额外加锁;若确定单线程环境,可用 _st 版本稍提性能。
进阶技巧:异步日志、自定义 sink 与错误处理
高频写日志时,同步 I/O 可能阻塞主线程。启用异步模式:
auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async", "logs/async.log");
// 注意:程序退出前需调用 spdlog::shutdown() 刷盘
如需输出到网络、数据库或自定义设备,可继承 spdlog::sinks::sink 实现自己的 sink;常见需求已有社区实现(如 spdlog-sinks-kafka)。
错误处理建议:
- 初始化失败时,spdlog 会抛出
spdlog::spdlog_ex异常,应捕获并 fallback 到stderr或静默处理 - 避免在 signal handler(如 SIGSEGV)中直接调用 spdlog,因其内部可能 malloc;可改用
spdlog::default_logger_raw()的 lock-free 分支(需编译时定义SPDLOG_COMPILED_LIB并链接 lib)











