📌 项目地址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);
    }
    // 实际使用时需要捕获并处理异常
}

注意:这里的 spdnamespace spd = spdlog; 的别名,stdout_color_mt 返回一个多线程安全的彩色控制台 logger。infoerror 方法接受 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 语法,需要额外了解。
这篇文章对你有帮助吗?

发表回复