信息发布→ 登录 注册 退出

c++如何进行日志记录 c++ spdlog库使用教程【指南】

发布时间:2026-01-04

点击量:
spdlog 是 C++ 中主流轻量高效日志库,支持多线程、多输出目标、格式化与等级控制,无需 Boost 依赖;支持 header-only 使用,提供控制台、文件、滚动、每日分割等 logger,可自定义格式、级别,具备异步日志与自定义 sink 能力。

在 C++ 项目中做日志记录,spdlog 是目前最主流、轻量又高效的选择。它支持多线程、多种输出目标(控制台、文件、滚动文件)、丰富格式化、等级控制,且无需依赖 Boost 或其他重型库。

快速上手:安装与基础用法

spdlog 是 header-only 库(默认情况下),只需下载头文件即可使用;也可通过包管理器集成:

  • CMake + vcpkgvcpkg install spdlog,然后在 CMakeLists.txtfind_package(spdlog)
  • Conanconan install spdlog/1.14.1
  • 手动引入:从 GitHub 仓库 下载 include/spdlog 目录,加入编译 include 路径

最简示例(控制台日志):

#include "spdlog/spdlog.h"

int main() {
    spdlog::info("Hello, {}!", "world");           // INFO 级别
    spdlog::warn("This is a warning");
    spdlog::error("An error occurred: {}", 404);
    return 0;
}

创建不同类型的 logger 实例

全局 logger(如 spdlog::info)方便但不够灵活;实际项目推荐显式创建 logger 对象,便于隔离、复用和配置:

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

  • 控制台 loggerauto console = spdlog::stdout_logger_mt("console");
  • 文件 loggerauto file = spdlog::basic_logger_mt("file", "logs/app.log");
  • 滚动文件 logger(按大小)auto rotating = spdlog::rotating_logger_mt("rotating", "logs/rotating.txt", 1048576, 5);(单文件最大 1MB,最多保留 5 个旧文件)
  • 每日分割 loggerauto daily = spdlog::daily_logger_mt("daily", "logs/daily.txt", 2, 30);(每天 2:30 自动切分)

自定义格式、级别与线程安全

spdlog 默认格式为 [HH:MM:SS] [level] message,可通过 set_pattern() 修改:

auto logger = spdlog::stdout_logger_mt("my_logger");
logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%n] [%^%l%$] %v"); 
// 输出示例:[2025-05-20 14:22:03.123] [my_logger] [INFO] Hello

日志级别从低到高:trace 。可全局设置最低输出级别:

  • spdlog::set_level(spdlog::level::debug);(影响所有 logger)
  • logger->set_level(spdlog::level::warn);(仅该 logger)

所有 _mt(multi-thread)版本 logger 内置线程安全,无需额外加锁;若确定单线程环境,可用 _st 版本稍提性能。

进阶技巧:异步日志、自定义 sink 与错误处理

高频写日志时,同步 I/O 可能阻塞主线程。启用异步模式:

auto async_file = spdlog::basic_logger_mt("async", "logs/async.log");
// 注意:程序退出前需调用 spdlog::shutdown() 刷盘

如需输出到网络、数据库或自定义设备,可继承 spdlog::sinks::sink 实现自己的 sink;常见需求已有社区实现(如 spdlog-sinks-kafka)。

错误处理建议:

  • 初始化失败时,spdlog 会抛出 spdlog::spdlog_ex 异常,应捕获并 fallback 到 stderr 或静默处理
  • 避免在 signal handler(如 SIGSEGV)中直接调用 spdlog,因其内部可能 malloc;可改用 spdlog::default_logger_raw() 的 lock-free 分支(需编译时定义 SPDLOG_COMPILED_LIB 并链接 lib)
标签:# 多线程  # 也可  # 只需  # 已有  # 最多  # 切分  # 进阶  # 自己的  # 个旧  # 自定义  # 数据库  # 异步  # 对象  # console  # Thread  # 主线程  # git  # 线程  # signal  # 继承  # auto  # Error  # include  # kafka  # asic  # igs  # red  # c++  # ai  # app  # github  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!