440
社区成员




# 项目下载
git clone https://github.com/gabime/spdlog.git
#编译
cd spdlog
mkdir build
cd build
cmake ..
make -j
#安装
sudo make install
#或者直接下载
sudo apt-get install libspdlog-dev
类别 | 特征描述 |
---|---|
🚀 性能 | 超高性能(同步支持百万级,异步千万级日志/秒) |
⚙️ 格式化 | 基于 fmtlib ,支持 Python 风格的 {} 格式化 |
🌐 多线程支持 | 原生支持多线程安全写入,同步 + 异步两种模式 |
💾 输出灵活 | 支持多个输出目标(控制台、文件、滚动文件、syslog、自定义 sink) |
📦 头文件库 | 完全 头文件-only,无需链接 .lib 或 .so |
🪵 日志级别 | trace、debug、info、warn、error、critical、off 全部支持 |
🕓 滚动日志支持 | 支持按 大小 / 日期 滚动日志文件 |
📚 异常处理 | 默认捕获日志错误(可自定义处理器) |
🧵 线程池 | 异步日志使用轻量级线程池 + 无锁队列,提高吞吐量 |
📖 自定义格式 | 时间戳、线程号、进程号、源文件、函数名、行号……可以全部格式化输出 |
🔐 线程安全 | 日志器默认线程安全;可以创建非线程安全版本(提高性能) |
🔧 易用性 | 接口简洁,易于集成;支持自定义宏、封装自己的日志框架 |
🧪 单元测试友好 | 可重定向输出到 std::ostream ,便于测试验证输出 |
📱 兼容性强 | 支持 C++11、C++14、C++17、Windows、Linux、Mac 全平台 |
fmt :格式化输出(C++20)
多种日志级别:trace,debug,info,warn,error,critial
多种输出目标:可以将日志输出到控制台、文件或通过网络 发送到远程服务器
格式化输出:允许用户以结构化的方式 输出日志消息
Loggers 负责记录日志消息,Sinks 决定了日志消息的输出位 置,Formatters 负责将日志消息转换为特定格式,Async Logger 异步地将日志消息写入到目标 Sink 中,Registry 用于管 理这些组件
用户态内核态
级别 | 用途描述 |
---|---|
trace | 最细节的日志,追踪变量、执行路径,性能分析时有用(函数级别打印) |
debug | 调试信息,用于开发期观察程序逻辑,如状态变化、调用流程(模块级别状态) |
info | 一般运行信息,系统启动、任务完成、资源加载等(用户可以看到) |
warn | 非致命问题,程序还能运行,比如配置异常、网络抖动(可忽略但需注意) |
error | 程序运行失败了某个功能,比如读取文件失败、通信断开等(需重点关注) |
critical | 致命错误,系统可能崩溃或者需要立刻介入,如系统异常终止(报警级别) |
最低日志级别:高于它的才会显示,低的不显示
部署发布的时候,通常要求日志级别较高
logger->set_level(...)
控制输出级别,避免生产中输出太多调试信息获取实例是线程安全的
auto logger = spdlog::stdout_color_mt("console");
auto sink = make_shared<spdlog::sinks::stdout_color_sink_mt>();
auto logger = make_shared<spdlog::logger>("mylogger", sink);
spdlog::register_logger(logger);
spdlog::get("mylogger")->info("Hello from anywhere!");
可用的sink
// stdout_color_sink_mt:彩色终端输出(多线程)
// basic_file_sink_mt:写入基础文件
// rotating_file_sink_mt:日志轮转(按文件大小)
// daily_file_sink_mt:每天生成一个日志文件
// null_sink_mt:静默输出(调试用途)
自定义的sink
继承 spdlog::sinks::base_sink
或 sink
,实现 sink_it_()
和 flush_()
方法即可
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v");
%v
:日志内容%t
:线程 ID%s
:源文件名%#
:源代码行号%!
:函数名%^ %$
:高亮开头/结尾(用于终端)SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "msg");
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
auto logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "logs/async.txt");
auto sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/async.txt", true);
auto logger = spdlog::create_async("async_logger", sink);
auto logger = spdlog::create_async_nb<spdlog::sinks::basic_file_sink_mt>("async_nb_logger", "logs/nb.txt");
// 初始化线程池:队列大小8192,线程数1
spdlog::init_thread_pool(8192, 1);
auto sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/custom.txt", true);
auto async_logger = std::make_shared<spdlog::async_logger>(
"custom_async",
sink,
spdlog::thread_pool(),
spdlog::async_overflow_policy::block);
spdlog::register_logger(async_logger);
logger->flush();
spdlog::flush_on(spdlog::level::err);
spdlog::flush_every(std::chrono::seconds(3));