c++如何使用spdlog日志库_c++高性能异步日志框架【教程】

18次阅读

spdlog 是轻量高性能 c++ 日志库,支持同步/异步线程安全及多种输出目标,头文件直连或 CMake 快速集成,提供控制台、文件、滚动、每日日志器,可自定义格式、级别与刷新策略。

c++如何使用spdlog日志库_c++高性能异步日志框架【教程】

spdlog 是一个轻量、高性能的 C++ 日志库,支持同步/异步日志、多线程安全、多种输出目标(控制台、文件、滚动文件等),且无需依赖 Boost 或其他重型库。它开箱即用,适合嵌入式到服务端各类项目。

快速集成:头文件直连或 CMake 引入

最简单方式是直接使用 header-only 模式:

  • GitHub 仓库 下载 include/spdlog 目录,放入项目 include 路径
  • 在源文件中 #include 即可开始使用

推荐 CMake 方式(更利于依赖管理和异步支持):

find_package(spdlog REQUIred) target_link_libraries(your_target PRIVATE spdlog::spdlog)

注意:若需异步日志,CMake 构建时要确保启用线程支持(默认开启),且链接 spdlog::spdlog_async

立即学习C++免费学习笔记(深入)”;

基础日志器创建与使用

spdlog 提供多种预设日志器,常用如下:

  • spdlog::stdout_logger_mt("console"):多线程安全的控制台日志器
  • spdlog::basic_logger_mt("file", "logs/app.log"):写入单个文件
  • spdlog::rotating_logger_mt("rotate", "logs/app.log", 1024*1024, 5):自动滚动(最大 1MB × 5 个备份)

使用示例:

auto console = spdlog::stdout_logger_mt("console"); console->info("Hello {}", "World");           // 格式化输出(类似 fmt) console->warn("Something went wrong"); console->Error("Error code: {}", 404);

启用异步日志:提升高并发写入性能

同步日志在高频调用时可能阻塞主线程;异步模式将日志消息推入队列,由独立线程批量写入,显著降低延迟。

  • 创建异步日志器:
    auto async_file = spdlog::basic_logger_mt("async_file", "logs/async.log");
    async_file->flush_on(spdlog::level::info);
    auto async_logger = spdlog::async_logger("async", std::move(async_file), spdlog::Thread_pool());
  • 更简洁方式(推荐):auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30); // 每天 2:30 滚动 默认就是异步的(若已初始化 thread pool)
  • 全局线程池只需初始化一次:spdlog::init_thread_pool(8192, 1); // 队列大小 8192,1 个工作线程

自定义格式、级别与行为

spdlog 默认格式为 [HH:MM:SS.NNN] [level] [logger_name] message,可轻松修改:

  • 设置全局格式:spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%n] %v");
  • 为特定日志器设格式:console->set_pattern("[%^%l%$] %v");
  • 调整日志级别:console->set_level(spdlog::level::debug);(支持 trace/debug/info/warn/error/critical/off)
  • 启用自动刷新(尤其对文件日志):file_logger->flush_on(spdlog::level::err);

提示:生产环境建议关闭 debug/trace 级别,避免性能损耗;可通过宏控制编译期过滤,如 #define SPDLOG_COMPILED_LIB + 静态链接进一步减小体积。

基本上就这些。spdlog 上手快、配置灵活、性能扎实,合理搭配异步+滚动+级别控制,就能支撑大多数 C++ 项目的日志需求。

text=ZqhQzanResources