spdlog 介绍与使用指南
spdlog 介绍与使用指南
1. spdlog 简介
spdlog 是一个快速的 C++ 日志库,具有以下特点:
- 高性能:非常低的开销,异步模式下可以达到每秒数百万条日志
- 头部文件库:只需包含头文件即可使用
- 跨平台:支持 Windows、Linux、MacOS
- 丰富的功能:多线程、日志轮换、多种日志级别等
- 灵活的输出:支持控制台、文件、系统日志等多种输出方式
2. 安装 spdlog
2.1 使用包管理器安装
# vcpkg
vcpkg install spdlog# Conan
conan install spdlog/1.11.0
2.2 从源码安装
git clone https://github.com/gabime/spdlog.git
cd spdlog
mkdir build && cd build
cmake .. && make -j
sudo make install
2.3 直接包含头文件(最简单方式)
只需将 spdlog 头文件放入你的项目 include 路径即可。
3. 基本使用
3.1 简单示例
#include <spdlog/spdlog.h>int main() {// 设置日志级别spdlog::set_level(spdlog::level::debug);// 输出不同级别的日志spdlog::debug("This is a debug message");spdlog::info("Welcome to spdlog!");spdlog::warn("This is a warning");spdlog::error("This is an error message");spdlog::critical("This is a critical message!");// 格式化输出spdlog::info("Hello, {}!", "World");spdlog::info("PI is {:.2f}", 3.14159);return 0;
}
3.2 日志级别
spdlog 有以下日志级别(从低到高):
trace
- 非常详细的调试信息debug
- 调试信息info
- 常规信息warn
- 警告信息error
- 错误信息critical
- 严重错误信息off
- 关闭所有日志
4. 高级功能
4.1 创建日志器
#include <spdlog/sinks/basic_file_sink.h>int main() {// 创建文件日志器auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt");file_logger->info("This message will be written to the file");// 创建控制台日志器auto console = spdlog::stdout_color_mt("console");console->info("This message will appear on the console");// 使用特定日志器spdlog::get("file_logger")->info("Another way to use the logger");return 0;
}
4.2 异步日志
#include <spdlog/async.h>int main() {// 创建异步日志器spdlog::init_thread_pool(8192, 1); // 队列大小和线程数auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async-log.txt");for (int i = 0; i < 100; ++i) {async_file->info("Async message #{}", i);}spdlog::drop_all(); // 确保所有日志在程序结束前被刷新return 0;
}
4.3 日志轮换
#include <spdlog/sinks/rotating_file_sink.h>int main() {// 创建轮换日志器,最大5MB,保留3个文件auto rotating_logger = spdlog::rotating_logger_mt("rotating_logger", "logs/rotating.txt", 1048576 * 5, 3);for (int i = 0; i < 10000; ++i) {rotating_logger->info("Log message #{}", i);}return 0;
}
4.4 多接收器日志器
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>int main() {// 创建多个接收器auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt");// 组合接收器创建日志器spdlog::logger logger("multi_sink", {console_sink, file_sink});logger.set_level(spdlog::level::debug);logger.info("This message goes to both console and file");logger.warn("Warning message on both outputs");return 0;
}
5. 自定义格式
int main() {// 获取默认日志器并设置格式auto logger = spdlog::default_logger();logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [thread %t] %v");logger->info("Custom format message");// 格式说明:// %Y - 年// %m - 月// %d - 日// %H - 小时// %M - 分钟// %S - 秒// %e - 毫秒// %l - 日志级别// %t - 线程ID// %v - 实际消息return 0;
}
6. 性能建议
- 对于高性能场景,使用异步日志
- 避免在日志语句中进行复杂计算
- 生产环境中适当提高日志级别(如 info 或 warn)
- 对于频繁调用的代码路径,考虑使用宏定义来完全移除日志语句
7. 总结
spdlog 是一个功能强大且易于使用的 C++ 日志库,适合从简单到复杂的各种应用场景。它的高性能和灵活性使其成为许多 C++ 项目的首选日志解决方案。