3.3.1 spdlog异步日志

news2025/4/15 10:23:18

文章目录

  • 3.3.1 spdlog异步日志
    • 1. spdlog
      • 1. 日志作用
      • 2 .同步日志和异步日志区别
    • 2. spdlog是什么
      • 下载命令:
      • 2. spdlog为什么高效
      • 3. spdlog特征
      • 5. spdlog输出控制
      • 6. 处理流程
      • 7. 文件io
      • 8.问题
    • 2. 如何创建logger
    • 3. 如何创建sink
    • 4. 如何自定义格式化
    • 5. 如何创建异步日志
    • 6. 刷新策略

3.3.1 spdlog异步日志

1. spdlog

1. 日志作用

  1. 追踪层序运行状态
  2. 出现问题提供现场运行信息
  3. 分析性能信息瓶颈和潜在系统故障

2 .同步日志和异步日志区别

  • 同步日志:日志函数调用 会直接执行写入操作(比如写到控制台、文件等)写入完成后函数才返回,日志写入和业务线程在同一线程同步执行
  • 异步日志:日志调用将日志消息 推入一个队列实际的写入操作由 后台线程 异步完成,业务线程不会阻塞

2. spdlog是什么

下载命令:


# 项目下载
git clone https://github.com/gabime/spdlog.git
#编译
cd spdlog
mkdir build
cd build
cmake ..
make -j
#安装
sudo make install


#或者直接下载
sudo apt-get install libspdlog-dev

2. spdlog为什么高效

  1. 零成本抽象:通过模板和内联函数实现零成本抽象,确保只有在真正需要的时候才进行日志记录, 日志格式化和消息组装大多在编译期就完成
  2. 异步消息记录:可以将 日志消息发送到线程池进行处理,从而减少对主线程性能的影响
  3. 高效格式化:fmt 库进行高效的字符串格式化, 减少了格式化日志消息所需的时间

3. spdlog特征

类别特征描述
🚀 性能超高性能(同步支持百万级,异步千万级日志/秒)
⚙️ 格式化基于 fmtlib,支持 Python 风格的 {}格式化
🌐 多线程支持原生支持多线程安全写入,同步 + 异步两种模式
💾 输出灵活支持多个输出目标(控制台、文件、滚动文件、syslog、自定义 sink)
📦 头文件库完全 头文件-only,无需链接 .lib
.so
🪵 日志级别trace、debug、info、warn、error、critical、off 全部支持
🕓 滚动日志支持支持按 大小 / 日期 滚动日志文件
📚 异常处理默认捕获日志错误(可自定义处理器)
🧵 线程池异步日志使用轻量级线程池 + 无锁队列,提高吞吐量
📖 自定义格式时间戳、线程号、进程号、源文件、函数名、行号……可以全部格式化输出
🔐 线程安全日志器默认线程安全;可以创建非线程安全版本(提高性能)
🔧 易用性接口简洁,易于集成;支持自定义宏、封装自己的日志框架
🧪 单元测试友好可重定向输出到 std::ostream
,便于测试验证输出
📱 兼容性强支持 C++11、C++14、C++17、Windows、Linux、Mac 全平台

5. spdlog输出控制

fmt :格式化输出(C++20)

  1. 多种日志级别:trace,debug,info,warn,error,critial

  2. 多种输出目标:可以将日志输出到控制台、文件或通过网络 发送到远程服务器

  3. 格式化输出:允许用户以结构化的方式 输出日志消息

6. 处理流程

Loggers 负责记录日志消息,Sinks 决定了日志消息的输出位 置,Formatters 负责将日志消息转换为特定格式,Async Logger 异步地将日志消息写入到目标 Sink 中,Registry 用于管 理这些组件

7. 文件io

用户态内核态

8.问题

  1. 多线程使用日志库,跟同步和异步是否有关联
    没有什么关联
  2. 同一个线程处理的,是不是就是同步的
    如果是当前处理程序处理的那就是同步的,如果仅仅是获得完成通知,那就只是协程上的同步
  3. 为什么需要这么多的日志级别
    trace,debug,info,warn,error,critical
    左到右,级别越来越高
级别用途描述
trace最细节的日志,追踪变量、执行路径,性能分析时有用(函数级别打印
debug调试信息,用于开发期观察程序逻辑,如状态变化、调用流程(模块级别状态
info一般运行信息,系统启动、任务完成、资源加载等(用户可以看到
warn非致命问题,程序还能运行,比如配置异常、网络抖动(可忽略但需注意
error程序运行失败了某个功能,比如读取文件失败、通信断开等(需重点关注
critical致命错误,系统可能崩溃或者需要立刻介入,如系统异常终止(报警级别

最低日志级别:高于它的才会显示,低的不显示

部署发布的时候,通常要求日志级别较高

  • 分级控制打印:通过 logger->set_level(...) 控制输出级别,避免生产中输出太多调试信息
  • 提高性能:只记录重要日志,减少 I/O 开销
  • 定位问题快速准确:关键错误更容易定位,细节日志帮助开发回溯问题

2. 如何创建logger

获取实例是线程安全的

  1. 工厂方法创建
auto logger = spdlog::stdout_color_mt("console");
  1. 手动创建
auto sink = make_shared<spdlog::sinks::stdout_color_sink_mt>();
auto logger = make_shared<spdlog::logger>("mylogger", sink);
spdlog::register_logger(logger);
  1. 注册logger,目的为了全局访问
spdlog::get("mylogger")->info("Hello from anywhere!");

3. 如何创建sink

可用的sink

// stdout_color_sink_mt:彩色终端输出(多线程)

// basic_file_sink_mt:写入基础文件

// rotating_file_sink_mt:日志轮转(按文件大小)

// daily_file_sink_mt:每天生成一个日志文件

// null_sink_mt:静默输出(调试用途)

自定义的sink

继承 spdlog::sinks::base_sinksink,实现 sink_it_()flush_() 方法即可

4. 如何自定义格式化

  1. set_paattern
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v");

  1. 扩展falgs
  • %v:日志内容
  • %t:线程 ID
  • %s:源文件名
  • %#:源代码行号
  • %!:函数名
  • %^ %$:高亮开头/结尾(用于终端)
  1. 源文件定位flags
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "msg");

5. 如何创建异步日志

  1. 使用async_factory
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"

auto logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "logs/async.txt");

  1. creat_async,自定义方式
auto sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/async.txt", true);
auto logger = spdlog::create_async("async_logger", sink);

  1. creat_async_nb,非阻塞写法,不阻塞主线程写入日志
auto logger = spdlog::create_async_nb<spdlog::sinks::basic_file_sink_mt>("async_nb_logger", "logs/nb.txt");

  1. async_logger
// 初始化线程池:队列大小8192,线程数1
spdlog::init_thread_pool(8192, 1);

auto sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/custom.txt", true);
auto async_logger = std::make_shared<spdlog::async_logger>(
    "custom_async",
    sink,
    spdlog::thread_pool(),
    spdlog::async_overflow_policy::block);

spdlog::register_logger(async_logger);

  1. 默认线程池只有一个线程,队列大小8192,
  • 优点:低资源占用,保证 FIFO 顺序。
  • 缺点: 日志处理速度受限于一个线程
  1. 处理队列满:async_overflow_policy:block,overrun_oldest

  2. 多线程线程池,日志输出无法保证有序

6. 刷新策略

  1. 手动flush
logger->flush();

  1. 条件flush
spdlog::flush_on(spdlog::level::err);

  1. 间隔flush
spdlog::flush_every(std::chrono::seconds(3));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 基础(4)—Java 对象布局及偏向锁、轻量锁、重量锁介绍

一、Java 对象内存布局 1、对象内存布局 一个对象在 Java 底层布局&#xff08;右半部分是数组连续的地址空间&#xff09;&#xff0c;如下图示&#xff1a; 总共有三部分总成&#xff1a; 1. 对象头&#xff1a;储对象的元数据&#xff0c;如哈希码、GC 分代年龄、锁状态…

【AI论文】OLMoTrace:将语言模型输出追溯到万亿个训练标记

摘要&#xff1a;我们提出了OLMoTrace&#xff0c;这是第一个将语言模型的输出实时追溯到其完整的、数万亿标记的训练数据的系统。 OLMoTrace在语言模型输出段和训练文本语料库中的文档之间找到并显示逐字匹配。 我们的系统由扩展版本的infini-gram&#xff08;Liu等人&#xf…

SAP GUI 显示SAP UI5应用,并实现SSO统一登陆

想用SAP UI5 做一写界面&#xff0c;又不想给用户用标准的Fiori APP怎么办&#xff1f;我觉得可以用可配置物料标准功能的思路&#xff0c;在SAP GUI中显示UI5界面&#xff0c;而不是跳转到浏览器。 代码实现后的效果如下&#xff1a; 1、调用UI5应用&#xff0c;适用于自开发…

HumanDil-Ox-LDL:保存:2-8℃保存,避免强光直射,不可冻存

化学试剂的基本介绍&#xff1a; /// 英文名称&#xff1a;HumanDil-Oxidized LowDensityLipoprotein /// 中文名称&#xff1a;人源红色荧光标记氧化型低密度脂蛋白 /// 浓度&#xff1a;1.0-4.0 mg/ml /// 外观&#xff1a;乳状液体 /// 缓冲液组分&#xff1a;PBS&…

开箱即用!推荐一款Python开源项目:DashGo,支持定制改造为测试平台!

大家好&#xff0c;我是狂师。 市面上的开源后台管理系统项目层出不穷&#xff0c;对应所使用到的技术栈也不尽相同。 今天给大家推荐一款开源后台管理系统: DashGo&#xff0c;不仅部署起来非常的简单&#xff0c;而且它是基于Python技术栈实现的&#xff0c;使得基于它进行…

JS小练习0.1——弹出姓名

分析&#xff1a;1.用户输入 2.内部处理保存数据 3.打印输出 <body><script>let name prompt(输入你的名字)document.write(name)</script> </body>

vue自定义颜色选择器

vue自定义颜色选择器 效果图&#xff1a; step0: 默认写法 调用系统自带的颜色选择器 <input type"color">step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"container"><!-- 颜…

LibreOffice Writer使用01去除单词拼写判断的红色下划线

这个软件还是非常有特色的&#xff0c;因为大家需要office的全部功能&#xff0c;常常忽略了这个软件的使用体验。 csdn不是特别稳定&#xff0c;linux也没有什么比较好的md编辑器&#xff0c;所以我选择这个软件来记录我的临时博客&#xff0c;原因无他&#xff0c;它可以保存…

0401react中使用css-react-css-仿低代码平台项目

文章目录 1、普通方式-内联使用css2、引入css文件2.1、示例2.2、classnames 3、内联css与引入css文件对比3.1、内联css3.2、 外部 CSS 文件&#xff08;External CSS&#xff09; 4、css module5、sass6、classnames组合scss modules7、css-in-js7.1、CSS-in-JS 的核心特性7.2、…

《线性表、顺序表与链表》教案(C语言版本)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

[ctfshow web入门] web33

信息收集 相较于上一题&#xff0c;这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句&#xff0c;但是$_GET[a]也是一样的 没有括号可以使用include&#xff0c;没有引号可以使用$_GET 可以参考[ctfshow web入门] web32&#xff0c;其中的所…

三、TorchRec中的Optimizer

TorchRec中的Optimizer 文章目录 TorchRec中的Optimizer前言一、嵌入后向传递与稀疏优化器融合如下图所示&#xff1a;二、上述图片的关键步骤讲解&#xff1a;三、优势四、与传统优化器对比总结 前言 TorchRec 模块提供了一个无缝 API&#xff0c;用于在训练中融合后向传递和…

webrtc pacer模块(一) 平滑处理的实现

Pacer起到平滑码率的作用&#xff0c;使发送到网络上的码率稳定。如下的这张创建Pacer的流程图&#xff0c;其中PacerSender就是Pacer&#xff0c;其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…

河北工程大学e2e平台,python

题目&#xff0c;选择题包100分&#xff01; 题目&#xff0c;选择题包100分&#xff01; 题目&#xff0c;选择题包100分&#xff01; 联系&#x1f6f0;&#xff1a;18039589633

BeautifulSoup 踩坑笔记:SVG 显示异常的真正原因

“这图是不是糊了&#xff1f;”以为是样式缺了&#xff1f;试试手动复制差异在哪&#xff1f;想用对比工具一探究竟……简单到不能再简单的代码&#xff0c;有问题吗&#xff1f;最后的真相&#xff1a;viewBox vs viewbox&#xff0c;preserveAspectRatio vs preserveaspectr…

【browser-use+deepseek】实现简单的web-ui自动化

browser-use Web-UI 一、browser-use是什么 Browser Use 是一款开源Python库&#xff0c;专为大语言模型设计的智能浏览器工具&#xff0c;目的是让 AI 能够像人类一样自然地浏览和操作网页。它支持多标签页管理、视觉识别、内容提取&#xff0c;并能记录和重复执行特定动作。…

MOS管的发热原因和解决办法

发热来源 如上图&#xff0c;MOS管的工作状态有4种情况&#xff0c;分别是开通过程&#xff0c;导通过程&#xff0c;关断过程和截止过程。 导致发热的损耗主要有两种&#xff1a;开关损耗、导通损耗。 导通损耗 导通损耗比较好计算&#xff0c;根据驱动电压VGS值可以得到MOS…

科技项目验收测试怎么做?验收测试报告如何获取?

科技项目从研发到上市需要一个很长的周期&#xff0c;并且在上市之前还有一个至关重要的交付过程&#xff0c;那就是项目验收&#xff0c;验收需要通过验收测试来呈现。科技项目验收测试是确保项目成功交付的关键步骤&#xff0c;那么是如何进行的呢?企事业单位想要获取科技项…

AutoEval:现实世界中通才机器人操作策略的自主评估

25年3月来自 UC Berkeley 和 Nvidia 的论文“AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World”。 可规模化且可复现的策略评估一直是机器人学习领域长期存在的挑战。评估对于评估进展和构建更优策略至关重要&#xff0c;但在现…