当前位置: 首页 > news >正文

【C++】spdlog基础使用

目录

一、基础入门:最简单的日志输出

二、核心:创建不同类型的日志器

1. 控制台日志器(带颜色)

2. 基础文件日志器(直接写入文件)

3. 轮转文件日志器(按大小 / 日期分割)

4. 异步日志器(高性能)

三、日志级别控制

四、自定义日志格式

常用占位符

代码示例

五、同时输出到控制台和文件

六、其他常用接口


一、基础入门:最简单的日志输出

#include <spdlog/spdlog.h> int main() { // 1. 直接使用全局默认日志器打印(默认输出到控制台) spdlog::info("这是一条普通信息"); spdlog::debug("这是一条调试信息"); // 默认级别是 info,debug 默认不会显示 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_mt<spdlog::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); // 设为 debug,debug 及以上都能看到 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_shared<spdlog::sinks::stdout_color_sink_mt>(); auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("./logs/multi_output.log", true); // 2. 把 sink 放进 vector std::vector<spdlog::sink_ptr> sinks {console_sink, file_sink}; // 3. 创建一个自定义 logger,包含这两个 sink auto multi_logger = std::make_shared<spdlog::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; }

感谢阅读,本文如有错漏之处,烦请斧正。

http://www.jsqmd.com/news/476657/

相关文章:

  • Mellanox网卡SR-IOV配置避坑指南:解决‘not enough MMIO resources‘报错(附完整参数解析)
  • 【2024】从Wumpus世界到智能体实战:基于PyGame与深度强化学习的探索与实现
  • Chrome DevTools字体太小?5分钟搞定自定义字体和样式(附完整CSS配置)
  • [Hello-CTF]RCE-Labs进阶解析:绕过preg_match的字符限制与通配符利用
  • 计算机毕业设计springboot校园食堂订餐系统 基于SpringBoot的高校智慧餐饮服务平台 SpringBoot驱动的校园线上餐饮预订与配送系统
  • 乐鑫ESP32/ESP8266射频测试全栈指南:从研发验证到量产落地
  • ESP32-S2-SOLO-2模组硬件架构与工程落地深度解析
  • ESP32-H2安全架构解析:寄存器控制、硬件加速与可信启动
  • 立创GD32VW553开发板模块移植手册:开源硬件生态构建指南
  • Win10家庭版升级专业版后,如何用Docker Desktop轻松玩转K8S(附避坑指南)
  • 从天空到算法:盘点那些定义无人机视觉研究的关键数据集
  • 迅为iMX6ULL开发板三大手册实战指南:从入门到精通
  • Zerotier vs Tailscale:哪个内网穿透工具更适合你的远程办公需求?
  • 解密navigator.geolocation.getCurrentPosition:从WGS84到GCJ02的坐标转换实战
  • 清音刻墨Qwen3在Vlog制作中的应用:一键生成高质量字幕
  • LongCat-Image-Editn V2生成效果一览:从换背景到加元素,样样精通
  • 在无外网环境下部署Prometheus与Grafana:构建企业级监控可视化平台
  • LiuJuan20260223Zimage场景实战:快速生成社交媒体配图与个人IP形象
  • Linux宝塔面板快速搭建Go项目:从零配置到一键部署
  • SPIRAN ART SUMMONER提示词(祈祷词)编写技巧:几句话召唤精美画面
  • STM32 USB OTG_FS全速控制器工程实践与双角色开发指南
  • Z-Image-GGUF惊艳效果展示:1024x1024高清樱花寺庙图生成作品集
  • 从零构建:在Codesys中实现原生MySQL Socket通信库
  • 2026精装房设计权威指南:户型优化与软装搭配全景解析,整案设计/室内设计/独立设计师,精装房设计品牌推荐排行榜单 - 品牌推荐师
  • ArkTs核心语法
  • 告别重复造轮子:用Copilot和快马一键生成标准登录注册模块
  • 视频中间件:大华IPC/NVR主动注册协议与多协议兼容适配实践
  • Web无障碍优化: 使网页中的下拉菜单更易于使用
  • 字节:早阶段视觉令牌剪枝EvoPrune
  • 2026这些中式服装加盟品牌排前列,值得关注,知名的中式服装加盟推荐排行优质企业盘点及核心优势详细解读 - 品牌推荐师