C++在高性能日志库(spdlog)的设计与使用

简介: 日志是调试和监控系统的重要手段。高性能场景下,日志不能成为性能瓶颈,尤其不能因为磁盘I/O或锁竞争拖慢业务线程。

1.日志库的挑战
日志是调试和监控系统的重要手段。高性能场景下,日志不能成为性能瓶颈,尤其不能因为磁盘I/O或锁竞争拖慢业务线程。C++社区中spdlog是目前最流行的高性能日志库,完全由头文件和C++11实现,采用异步日志、格式化缓存、无锁队列等优化。
参考:https://amwtm.cn/category/entrance.html

2.spdlog的核心设计
异步日志器:业务线程只将日志消息放入无锁队列(moodycamel::ConcurrentQueue),后台线程负责写磁盘或控制台。这使业务线程的耗时仅几十纳秒。
格式化优化:使用fmtlib(C++20std::format前身)进行快速格式化。自定义formatter避免stringstream开销。
Logger层级:支持多logger(如error_logger、access_logger),各自独立控制级别和输出目标。
轮转文件:内置按大小或时间轮转,自动压缩。

3.使用实例
创建一个异步文件日志器:
autofile_logger=spdlog::basic_logger_mt("file_logger","logs/app.log");
file_logger->set_level(spdlog::level::info);
file_logger->info("User{}loggedin",user_id);
宏定义可控制调试模式下打印更多信息。

4.性能对比
在基准测试中,spdlog异步日志每秒可处理200万条简单日志(平均每条<0.5微秒),而同步日志的fprintf可能高达数十微秒。内存占用方面,队列缓冲区可配置大小,避免无限增长。
参考:https://amwtm.cn/category/balcony.html

5.案例:交易系统的审计日志
某高频交易系统必须记录每个订单的完整生命周期(接收、转发、成交),且要求极低的性能损耗。使用spdlog异步日志:
业务线程调用order_logger->info(...)后立即返回。
单独的后台线程(优先级较低)批量写入SSD,每秒可记录30万条审计日志。
日志格式包含微秒时间戳(%E说明符),用于事后回放。
日志轮转按每小时分文件,超过1GB自动压缩,节省磁盘。

6.配置建议
级别过滤:发布版本使用warn级别,减少日志量。
同步日志:对于关键告警,可临时设为同步模式,确保即使后台线程崩溃也能输出。
自定义sink:可输出到syslog、网络、Elasticsearch(通过HTTP)。

7.与其他库对比
glog(Google):功能丰富,但性能稍逊。
log4cxx:Apache移植,较重,依赖多。
spdlog:轻量、快速、现代C++,成为首选。

8.总结
C++高性能日志库spdlog展示了如何通过异步和零拷贝设计,使日志记录几乎不影响业务性能。对于任何对延迟敏感的C++应用(游戏、交易、实时系统),spdlog是理想的日志基础设施。
参考:https://amwtm.cn

目录
相关文章
Windows下的CMake下载与安装
Windows下的CMake下载与安装
Windows下的CMake下载与安装
|
4月前
|
存储 算法 C++
C++在高性能内存池(MemoryPool)设计与实现
频繁调用new/delete或malloc/free会造成性能损耗(系统调用、锁竞争、内存碎片)。
243 3
|
4月前
|
存储 消息中间件 SQL
Java在分布式链路追踪系统(Jaeger)中的实现与集成
微服务架构中,一个用户请求可能跨越多达几十个服务。当出现延迟增加或错误时,难以定位具体哪个服务出问题。
223 5
|
4月前
|
人工智能 调度 流计算
Why Will OPC One-Person Companies Emerge in the AI Era? Understanding the New Individual Business Model Driven by AI Agents
AI时代一人公司(OPC)兴起,源于大模型、AI智能体与自动化工具对个体能力的倍增效应:单人即可调度AI完成研发、营销、交付等全链路闭环,实现“一人成军”。
423 2
|
4月前
|
人工智能 自然语言处理 安全
阿里云入选Gartner® CPaaS魔力象限报告「远见者」象限!
阿里云入选Gartner® CPaaS魔力象限报告「远见者」象限!
266 0
|
Java 编译器 数据库
异步日志方案——spdlog
异步日志方案——spdlog
|
机器学习/深度学习 人工智能 监控
单车、共享单车已标注数据集(图片已划分、已标注)|适用于深度学习检测任务【数据集分享】
数据是人工智能的“燃料”。一个高质量、标注精准的单车与共享单车数据集,不仅能够推动学术研究的进步,还能为智慧交通、智慧城市的建设提供有力支撑。 在计算机视觉领域,研究者们常常会遇到“数据鸿沟”问题:公开数据集与真实业务需求之间存在不匹配。本次分享的数据集正是为了弥补这一不足,使得研究人员与工程师能够快速切入单车检测领域,加速模型从实验室走向真实应用场景。
|
XML 运维 安全
【运维】KVM 虚拟机迁移
虚拟机迁移还是非常重要的,在任何云计算场合都适用
3825 5
【运维】KVM 虚拟机迁移
|
人工智能 大数据 程序员
一文看懂开源图化框架中的循环设计逻辑!
相信大家在日常工作中,已经精通各种循环逻辑的实现。就拿我来说吧,多年的工作经验,已经让我可以熟练的使用 C++,Python,英语等多种语言,循环多次输出“hello word”。不过大家有没有想过一个这样的问题:如何在一个有向无环图(Directed Acyclic Graph,简称dag)中实现循环呢?
1460 0
一文看懂开源图化框架中的循环设计逻辑!
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?

热门文章

最新文章