spdlog的简单使用
1.spdlog简介
spdlog 是一个快速、异步的、header-only 的 C++ 日志库。它提供了简单易用的 API 并具有高性能和可扩展性。
2.代码示例
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/daily_file_sink.h>
#include <spdlog/async.h>
int main() {
// 1. 基本控制台日志
spdlog::info("=== 基础控制台日志 ===");
spdlog::debug("调试信息");
spdlog::info("普通信息");
spdlog::warn("警告信息");
spdlog::error("错误信息");
spdlog::critical("严重错误");
// 2. 设置全局日志级别
spdlog::set_level(spdlog::level::debug); // 显示debug及以上级别
spdlog::debug("现在可以看到调试信息了");
// 3. 格式化输出
int apples = 5;
double price = 4.99;
spdlog::info("我有 {} 个苹果,每个 ${:.2f}", apples, price);
spdlog::warn("{:*^40}", " 重要警告 "); // 居中填充
// 4. 创建文件日志器
auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/basic.txt");
file_logger->info("这条日志会保存到文件");
// 5. 带旋转的文件日志 (防止文件过大)
auto rotating_logger = spdlog::rotating_logger_mt("rotating", "logs/rotating.txt", 1024 * 1024, 5);
for (int i = 0; i < 1000; ++i) {
rotating_logger->info("旋转日志测试 #{}", i);
}
// 6. 每日日志文件 (每天创建新文件)
auto daily_logger = spdlog::daily_logger_mt("daily", "logs/daily.txt");
daily_logger->info("每天一个新日志文件");
// 7. 自定义日志格式
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%n] %v");
spdlog::info("自定义格式的日志");
// 8. 创建带颜色的控制台日志器
auto console = spdlog::stdout_color_mt("console");
console->set_level(spdlog::level::debug);
console->info("带颜色的控制台输出");
console->error("红色错误信息");
// 9. 多Sink组合日志器 (控制台+文件)
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/multi.txt");
spdlog::logger multi_logger("multi", {console_sink, file_sink});
multi_logger.set_pattern("%+"); // 使用默认格式
multi_logger.warn("这条消息同时输出到控制台和文件");
// 10. 异步日志 (高性能场景)
spdlog::init_thread_pool(8192, 1); // 队列大小,线程数
auto async_logger = spdlog::create_async<spdlog::sinks::basic_file_sink_mt>(
"async_logger", "logs/async.txt");
for (int i = 0; i < 100; ++i) {
async_logger->info("异步日志消息 #{}", i);
}
// 11. 刷新策略
spdlog::flush_every(std::chrono::seconds(3)); // 每3秒刷新一次
spdlog::get("file_logger")->flush(); // 手动刷新特定日志器
// 12. 错误处理
try {
auto bad_logger = spdlog::basic_logger_mt("bad", "/invalid/path/log.txt");
} catch (const spdlog::spdlog_ex& ex) {
spdlog::error("日志器创建失败: {}", ex.what());
}
// 13. 全局注册和获取日志器
auto global_logger = spdlog::get("console");
if (global_logger) {
global_logger->info("通过名称获取已注册的日志器");
}
// 14. 设置全局日志器
spdlog::set_default_logger(spdlog::get("multi"));
spdlog::info("这条消息使用默认日志器输出");
// 15. 日志级别检查
if (spdlog::should_log(spdlog::level::debug)) {
spdlog::debug("条件日志:当前级别允许调试信息");
}
// 程序结束前清理
spdlog::shutdown();
return 0;
}
3.运行结果
4.总结
功能 | 说明 | 适用场景 |
---|---|---|
基础控制台日志 | 使用默认日志器输出到控制台 | 快速调试、简单应用 |
日志级别控制 | 设置全局或单个日志器的显示级别 | 生产环境过滤调试信息 |
格式化输出 | 使用 {} 占位符格式化复杂消息 |
动态内容日志 |
文件日志 | 持久化日志到文件 | 生产环境日志记录 |
旋转文件日志 | 限制单个文件大小,自动创建新文件 | 防止日志文件过大 |
每日文件日志 | 每天创建新的日志文件 | 按天归档日志 |
自定义格式 | 灵活组合时间、级别、名称等信息 | 统一日志格式规范 |
彩色控制台输出 | 不同级别显示不同颜色 | 开发环境调试 |
多Sink组合 | 同时输出到多个目标(控制台+文件+网络等) | 复杂日志分发需求 |
异步日志 | 使用后台线程处理日志,减少主线程阻塞 | 高性能应用、低延迟场景 |
自动刷新策略 | 定时或定量自动刷新缓冲区 | 防止日志丢失 |
异常处理 | 捕获并记录日志系统自身的错误 | 增强系统稳定性 |
全局日志器管理 | 注册、获取和设置默认日志器 | 跨模块统一日志管理 |
条件日志 | 在日志前检查级别避免不必要的计算 | 高性能场景优化 |