📌 项目地址:gabime/spdlog | ⭐ 29,354 颗星 | 🔧 C++ | 📜 未标注
项目核心价值
spdlog 是一个追求极致性能的 C++ 日志库,官方定位是 “Very fast, header only”。它的核心卖点有三个:
- 极快:官方基准测试中,单线程同步模式下写入 100 万条日志仅需 0.392 秒,远快于 boost log、glog、easylogging 等常见库。
- 纯头文件:不需要编译安装,直接把
include/spdlog文件夹复制到你的构建目录,用 C++11 编译器即可。 - 功能完整:支持异步模式、彩色控制台输出、文件轮转、每日日志、syslog、Windows 调试器输出,还能自定义日志目标。
实际用法
安装方式
最简单的方式就是复制头文件:
Copy the source folder to your build tree and use a C++11 compiler.
如果你喜欢用包管理器,README 给出了这些平台的命令:
- Ubuntu:
apt-get install libspdlog-dev - Homebrew:
brew install spdlog - FreeBSD:
cd /usr/ports/devel/spdlog/ && make install clean - Fedora:
yum install spdlog - Gentoo:
emerge dev-libs/spdlog - Arch Linux:
yaourt -S spdlog-git - vcpkg:
vcpkg install spdlog
最小示例
以下代码来自 README 的 Usage Example,创建了一个带颜色的控制台 logger,然后输出两条日志:
#include "spdlog/spdlog.h"
int main(int, char*[])
{
try
{
// Console logger with color
auto console = spd::stdout_color_mt("console");
console->info("Welcome to spdlog!");
console->error("Some error message with arg{}..", 1);
}
// 实际使用时需要捕获并处理异常
}
注意:这里的 spd 是 namespace spd = spdlog; 的别名,stdout_color_mt 返回一个多线程安全的彩色控制台 logger。info 和 error 方法接受 fmt 风格的格式化参数,用 {} 占位。
如果需要异步模式、syslog、自定义 sink 等用法,README 提到了 async_example()、syslog_example()、user_defined_example()、err_handler_example() 等示例函数,但未在 README 中贴出完整实现,请参考官方文档或仓库中的示例文件。
与同类工具的关键区别
- 性能:spdlog 的基准测试数据显示,单线程同步模式比 glog 快约 2.7 倍,比 boost log 快约 10 倍。异步模式下,100 线程写入 100 万条日志仅需 0.413 秒。
- 使用成本:纯头文件,零依赖(除了内置的 fmt 库),而 glog、boost log 需要链接库文件。
- 可扩展性:自定义日志目标只需实现
sink接口中的一个函数,比起重写整个 logger 要轻量得多。 - 运行时过滤:日志级别阈值既可以在编译时设定,也可以在运行时修改,方便线上动态调整日志详细程度。
注意事项
- 许可证:README 没有明确说明,但项目在 GitHub 上可见,使用前建议查看仓库中的 LICENSE 文件,确认是否符合你的项目合规要求。
- C++11 要求:需要支持 C++11 的编译器,不支持旧标准。
- 平台限制:官方声明支持 Linux、FreeBSD、Solaris、AIX、Windows(VC 2013+、cygwin)、Mac OSX(clang 3.5+)、Android,其他平台需要自行验证。
- README 的示例不完整:上述代码只覆盖了最简单的用法,异步、syslog、自定义 sink 等高级功能需要去官方 wiki 或 examples 目录查看完整代码。
- 格式化依赖 fmt:日志消息使用 fmt 库格式化,如果你已经用过
{}风格的占位符,上手会很快;但如果你习惯 printf 风格,README 提到支持可选的 printf 语法,需要额外了解。
这篇文章对你有帮助吗?