【C++】spdlog基础使用
目录一、基础入门最简单的日志输出二、核心创建不同类型的日志器1. 控制台日志器带颜色2. 基础文件日志器直接写入文件3. 轮转文件日志器按大小 / 日期分割4. 异步日志器高性能三、日志级别控制四、自定义日志格式常用占位符代码示例五、同时输出到控制台和文件六、其他常用接口一、基础入门最简单的日志输出#include spdlog/spdlog.h int main() { // 1. 直接使用全局默认日志器打印默认输出到控制台 spdlog::info(这是一条普通信息); spdlog::debug(这是一条调试信息); // 默认级别是 infodebug 默认不会显示 spdlog::warn(这是一条警告信息); spdlog::error(这是一条错误信息); spdlog::critical(这是一条致命错误信息); // 2. 支持 fmt 格式化语法和 printf 类似但更安全 int code 404; std::string path /api/user; spdlog::error(请求失败错误码{}路径{}, code, path); return 0; }二、核心创建不同类型的日志器spdlog 的核心是「日志器logger」你可以创建输出到不同目的地的日志器。1. 控制台日志器带颜色#include spdlog/spdlog.h #include spdlog/sinks/stdout_color_sinks.h int main() { // 创建多线程安全的控制台日志器推荐 // mt multi-thread多线程安全 auto console_logger spdlog::stdout_color_mt(my_console_logger); console_logger-info(你好控制台日志); console_logger-error(出错了这里是红色); // 也可以创建单线程版本性能更高但仅限单线程环境用 // auto console_logger_st spdlog::stdout_color_st(my_console_logger_st); return 0; }2. 基础文件日志器直接写入文件#include spdlog/spdlog.h #include spdlog/sinks/basic_file_sink.h int main() { // 创建多线程安全的文件日志器 // 参数1日志器名称 // 参数2日志文件路径 auto file_logger spdlog::basic_logger_mt(my_file_logger, ./logs/app.log); file_logger-info(这条日志会写入文件); file_logger-flush(); // 手动强制刷新一般不需要spdlog 会自动处理 return 0; }3. 轮转文件日志器按大小 / 日期分割常用可以防止单个日志文件过大。#include spdlog/spdlog.h #include spdlog/sinks/rotating_file_sink.h int main() { // 创建轮转文件日志器 // 参数1日志器名称 // 参数2基础文件名 // 参数3单个文件最大大小示例5MB // 参数4最多保留的文件数量示例保留3个旧文件 auto rotating_logger spdlog::rotating_logger_mt( my_rotating_logger, ./logs/rotating.log, 1024 * 1024 * 5, // 5MB 3 ); // 测试写很多日志触发轮转 for (int i 0; i 10000; i) { rotating_logger-info(这是第 {} 条轮转测试日志, i); } return 0; }4. 异步日志器高性能将日志写入交给后台线程且业务线程不阻塞适合高并发场景。#include spdlog/spdlog.h #include spdlog/async.h #include spdlog/sinks/basic_file_sink.h int main() { // 1. 初始化异步线程池只需初始化一次 // 参数1队列最大大小 // 参数2后台线程数量 spdlog::init_thread_pool(8192, 1); // 2. 创建异步文件日志器注意模板参数 async_factory auto async_logger spdlog::basic_logger_mtspdlog::async_factory( my_async_logger, ./logs/async.log ); async_logger-info(这条日志是后台线程异步写入的); return 0; }三、日志级别控制作用控制哪些日志能被输出级别从低到高trace debug info warn error critical off#include spdlog/spdlog.h int main() { auto logger spdlog::stdout_color_mt(level_logger); // 1. 设置日志级别只有 该级别的日志才会输出 logger-set_level(spdlog::level::debug); // 设为 debugdebug 及以上都能看到 logger-trace(看不到因为 trace debug); logger-debug(能看到); logger-info(能看到); // 2. 也可以设置全局默认日志器的级别 spdlog::set_level(spdlog::level::warn); return 0; }四、自定义日志格式spdlog 支持非常灵活的格式自定义通过占位符实现。常用占位符占位符含义示例%Y-%m-%d %H:%M:%S日期时间2026-03-10 14:30:00%n日志器名称my_logger%l日志级别小写info%L日志级别大写INFO%t线程 ID12345%v实际日志消息用户登录成功%P进程 ID9876代码示例#include spdlog/spdlog.h int main() { auto logger spdlog::stdout_color_mt(format_logger); // 设置自定义格式 // 示例格式[时间] [日志器名] [级别] 消息 logger-set_pattern([%Y-%m-%d %H:%M:%S] [%n] [%^%l%$] %v); // 注%^ 和 %$ 是颜色范围标记仅控制台有效 logger-info(这是自定义格式的日志); return 0; }五、同时输出到控制台和文件一个日志器同时输出到多个地方比如开发时控制台看生产时用文件存#include spdlog/spdlog.h #include spdlog/sinks/stdout_color_sinks.h #include spdlog/sinks/basic_file_sink.h #include vector int main() { // 1. 创建两个 sink输出目标 auto console_sink std::make_sharedspdlog::sinks::stdout_color_sink_mt(); auto file_sink std::make_sharedspdlog::sinks::basic_file_sink_mt(./logs/multi_output.log, true); // 2. 把 sink 放进 vector std::vectorspdlog::sink_ptr sinks {console_sink, file_sink}; // 3. 创建一个自定义 logger包含这两个 sink auto multi_logger std::make_sharedspdlog::logger(multi_logger, sinks.begin(), sinks.end()); // 设置级别和格式会应用到所有 sink multi_logger-set_level(spdlog::level::debug); multi_logger-set_pattern([%H:%M:%S] [%l] %v); // 注册为全局 logger之后可以用 spdlog::get 获取 spdlog::register_logger(multi_logger); // 测试这条日志会同时出现在控制台和文件里 multi_logger-info(这条日志会同时输出到控制台和文件); return 0; }六、其他常用接口#include spdlog/spdlog.h int main() { // 1. 注册与获取全局 logger跨文件使用很方便 auto my_logger spdlog::stdout_color_mt(global_logger); spdlog::register_logger(my_logger); // 注册 // 在其他文件里通过名字获取 auto logger spdlog::get(global_logger); if (logger) { logger-info(通过全局名字获取到了 logger); } // 2. 设置默认 logger之后 spdlog::info 就用这个 spdlog::set_default_logger(my_logger); spdlog::info(现在默认用我注册的 logger 了); // 3. 强制刷新所有 logger spdlog::flush_all(); // 4. 关闭所有 logger程序退出前可选 spdlog::shutdown(); return 0; }感谢阅读本文如有错漏之处烦请斧正。