spdlog中的异步日志方案

日志方案

同步日志方案:立即输出日志记录的方案才能继续执行其他任务。

异步日志方案:先抛出一个日志记录的任务到某个地方,不马上执行打印也不影响往下执行其他任务。

二者关键区别是产生日志记录并调用相关的日志任务接口之后,是否需要马上打印才能往下执行其他任务。

使用多线程的日志方案不一定是异步日志,多线程也能通过锁实现日志的串行打印。

使用单线程的也不一定是同步日志方案,也有可能通过网络通信将日志异步地抛给其他节点完成打印日志的任务。

Spdlog介绍

Spdlog是性能极高的C++日志库。

Spdlog的特点

零成本抽象:spdlog主要编程语言是C++,C++的设计理念之一就是零成本抽象。零成本抽象主要通过内联函数和模板实现。抽象意思是先放置一个大致的框架在代码中,等到真正使用的时候稍加输入和调用就能迅速地构建出要使用的复杂实例或数据结构,不用从0开始编写。零成本指的是相比起用C语言从0开始构建的实例,性能成本几乎一样,没有额外的资源开销,同时大大减少了开发成本。

可异步进行日志记录:把日志信息发送到线程池异步地进行处理,减少对主线程的影响。用户可以自定义线程的个数与队列的大小。如果队列已满可选:抛弃部分日志或者阻塞。

高效格式化:类似python的.format方法。

Spdlog的输出控制

Spdlog日志级别日志级别非spdlog独有,由低到高(重要等级从轻到重):trace、debug、info、warn、error、critical。

Spdlog多种输出目标:可以把日志输出到控制台、文件或者远程服务器。

格式化输出:类似python的.format方法。

Spdlog抽象模型

Registry管理logger/async logger, logger/async logger管理并输出到sink,sink把日志按某种格式输出到目的地,async logger需要依赖一个thread pool。

spd各部件主要功能

用伪代码介绍

Register:

register是一个全局的单例。如果没有显式地创建,一般在创建logger的时候会自动创建。

Spdlog::register_logger(std::shared_ptr<logger> new_logger) //把logger配置到register中去进行管理

Spdlog::get(logger_name) #获取logger

Logger:

如果没有显式地创建而是直接调用spd相关的输出函数,会自动创建默认参数的logger。

Flush策略 #指定sink把日志刷到目的地的方式

Logger->log(…) #输入日志到sink

Set_level #设置日志级别,只有大于等于设置的level才能输出出去

Async logger:

Logger->log(…) #在异步日志中仅仅是发布一个消息到线程池

Sink:

Set_level #自定义日志级别

Set_pattern #自定义日志格式

Set_formatter #补充Set_pattern的功能

Spdlog的使用

安装

方法一

方法二

初级应用

把日志按默认格式输出到控制台,背后会按默认参数创建logger和register并完成注册。

创建logger

Spdlog工厂方法创建

工厂方法的目的:屏蔽复杂的创建对象的流程。

工厂设计模式:有多个具体工厂类继承自一个抽象类,有多个具体产品类继承自另一个抽象类。每个具体工厂类里放置对应的具体产品生产类,只要创建了一个具体工厂实例就能调用具体的产品生产、使用等相关函数。

Spdlog里由很多头文件,不同的头文件里的有不同的“工厂”。

比如daily_file_sink.h指向的是把不同的日期的日志分开记录的“工厂”,hourly_file_sink是把每小时的日志分开记录的“工厂”,mongo_sink.h是把日志写到mongo数据库的“工厂”,ratating_file_sink.h是把日志文件按大小或者条数分割的“工厂”。

需要导入相关的头文件才能实现具体的“工厂”。用相应的头文件里的函数就能实现工厂的实力并“生产”对应的“产品”了。

Mt:multigthread。St:single thread。

这里的stdout_color_mt主要做了几件事情:

  1. 生成了一个对应的patten formatter(日志的输出格式)
  2. 基于默认的sink创建了一个logger,因为logger创建需要sink参数。
  3. 给logger起了一个名字“console”。
  4. 把logger注册到register。Register没有显式地创建,而是在logger创建的时候自动创建的单例。

在工厂模式的封装下,这些复杂的步骤和流程都被隐藏了。

手工方法创建

把工厂模式下被隐藏的步骤全部由自己显式书写,在这种模式下更方便设置多个日志的输出sink,参考sink模块。

创建sink

常规sink

如图创建两个sink,都将其绑定到logger上,于是logger可以输出日志到终端和文件上。

自定义pattern

sink2被修改了输出格式。

%^:表示日志级别的起始颜色标记。这个占位符可以用于在彩色控制台输出中设置日志级别的颜色。
%l:表示日志级别的占位符。它将被替换为实际的日志级别,例如 "info"、"error" 等。
%$:表示日志级别的结束颜色标记。这个占位符用于终止彩色控制台输出中的日志级别颜色。
%v:表示日志消息的占位符。它将被替换为实际的日志消息内容。

自定义formmater

formmater一般和pattern一起使用,是对pattern的补充。

class my_formatter_flag是固定用法,不必深究,只需要关注小红圈里的自定义的text的值。formatter->add_flag<my_formatter_flag>('*') 是往pattern里插入了一个*,也就是占位符*,未来这个占位符会被替换成hct。

创建异步日志

如果,先创建了一个队列8292,线程数量为8的线程池。选择异步工厂的数据类型创建logger并导入线程池。最后一个参数表示:如果等待队列已满,覆盖队列里存在时间最长是日志事件。类似的还有:

block: 当日志消息队列已满时,调用线程将被阻塞,直到有空间来写入新的消息。这种策略可以确保不会丢失任何日志消息,但可能会导致调用线程的阻塞。

discard_log_msg: 当日志消息队列已满时,新的日志消息将被直接丢弃,而不进行任何处理。这可能会导致丢失部分日志消息。

discard_policy: 与 discard_log_msg 类似,当日志消息队列已满时,新的日志消息将被丢弃。但是,相比于 discard_log_msg,discard_policy 会尝试创建一个新的日志消息对象,以便在资源释放后可以重新使用。这样可以减少内存分配的开销。

设置flush策略

sink输出日志一般都是先输出到缓存的,什么时候把日志记录从缓冲区刷到磁盘中,我们可以为此设置策略。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kafka】Kafka客户端认证失败:Cluster authorization failed.

背景 kafka客户端是公司内部基于spring-kafka封装的spring-boot版本&#xff1a;3.xspring-kafka版本&#xff1a;2.1.11.RELEASE集群认证方式&#xff1a;SASL_PLAINTEXT/SCRAM-SHA-512经过多年的经验&#xff0c;以及实际验证&#xff0c;配置是没问题的&#xff0c;但是业务…

【JVM】虚拟机的组成+字节码文件组成+类的生命周期

什么是JVM&#xff1f; JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM的功能 1.解释和运行&#xff1a;对字节码文件中的指令实时的解释成机器码让计算机执行。 2.内存管理&#xff1a;自动为对象、方法等分配内存&#xff0c;自动…

平升电子水库监管平台SQL注入漏洞复现

0x01 产品简介 唐山平升电子水库监管平台通过实时监测、数据分析、预警系统和远程控制等功能&#xff0c;为水库管理部门提供了一种全面、高效的数字化解决方案&#xff0c;帮助他们更好地管理和监控水库&#xff0c;确保水库的安全运行。 0x02 漏洞概述 唐山平升电子水库监…

sqlite3 c++ VS编译生成静态库

官网 https://www.sqlite.org/download.html 下载sqlite-amalgamation和x86版本下载sqlite-dll-win32-x86、x64位版本sqlite-dll-win64-x64 解压 SQLITE-AMALGAMATION包含 shell.csqlite3.csqlite3.hsqlite3ext.hsqlite-dll-win32-x86包含 sqlite3.def sqlite3.dll建立一个空…

Prometheus-JVM

一. JVM监控 通过 jmx_exporter 启动端口来实现JVM的监控 Github Kubernetes Deployment Java 服务&#xff0c;修改 wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar# 编写配置文件&#xff0…

limit查询报错问题

分页时候 limit 后面的公式是 (pageNum-1)*pageSize,pageSize 但是在数据库查询时候 当然在.XML中也不能像下面这么写,如果要计算 在业务层或者控制层计算好再传值进来

c++ / day01

1. 整理思维导图 2. 定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;实现求字符串大小的函数。 代码 #include <iostream>using namespace std;namespace myns {unsigned long long strlen(string s){return s.length();}}int main() {…

Chatgpt如何共享可以防止封号!

ChatGPT 是一个基于 GPT-3.5/GPT-4 模型的对话系统&#xff0c;它主要用于处理自然语言对话。通过训练模型来模拟人类的语言行为&#xff0c;ChatGPT 可以通过文本交流与用户互动。每个新版本的 GPT 通常都会在模型规模、性能和其他方面有一些改进。在目前免费版GPT-3.5 中&…

CNVD原创漏洞审核和处理流程

一、CNVD原创漏洞审核归档和发布主流程 &#xff08;一&#xff09;审核和归档流程 审核流程分为一级、二级、三级审核&#xff0c;其中一级审核主要对提交的漏洞信息完整性进行审核&#xff0c;漏洞符合可验证&#xff08;通用型漏洞有验证代码信息或多个互联网实例、事件型…

Tekton

一. 概念 Tekton 官网 Github Tekton 是一种用于构建 CI/CD 管道的云原生解决方案&#xff0c;它由提供构建块的 Tekton Pipelines&#xff0c;Tekton 作为 Kubernetes 集群上的扩展安装和运行&#xff0c;包含一组 Kubernetes 自定义资源&#xff0c;这些资源定义了您可以为…

Ubuntu 20.04使用Livox Mid-360

参考文章&#xff1a; Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一&#xff1a;Livox mid 360驱动安装与测试 前言&#xff1a; Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。 1. 安装Livox-SDK2 参…

java SSM课程平台系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM课程平台系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

RHCE9学习指南 第11章 网络配置

11.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP&#xff0c;子网掩码&#xff0c;网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制&#xff0c;例如&#xff0c; 11000000 10101000 00…

Linux上管理不同版本的 JDK

当在 Linux 上管理不同版本的 JDK 时&#xff0c;使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11&#xff0c;并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…

基于Wenet长音频分割降噪识别

Wenet是一个流行的语音处理工具&#xff0c;它专注于长音频的处理&#xff0c;具备分割、降噪和识别功能。它的长音频分割降噪识别功能允许对长时间录制的音频进行分段处理&#xff0c;首先对音频进行分割&#xff0c;将其分解成更小的段落或语音片段。接着进行降噪处理&#x…

循环冗余效验码的计算方法

循环冗余效验码的计算方法 G&#xff08;x&#xff09;&#xff1a; 在了解计算方法之前我们首先要明白G&#xff08;x&#xff09;表明的意思&#xff0c;这一步非常重要&#xff01; 例如&#xff0c;G&#xff08;x&#xff09; x^3 x^2 1 &#xff0c;该式子表明的编…

Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01

前言 直播间贡献榜是一种常见的直播平台功能&#xff0c;用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名&#xff0c;并实时更新&#xff0c;以鼓励观众积极参与直播活动。 在直播间贡献榜中&#xff0c;每个观众都有一个对应的贡献值&#…

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理

于NI kb摘录 1.概述 对于NI RIO系列设备&#xff08;CompactRIO、sbRIO、myRIO等&#xff09;进行编程时&#xff0c;需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”&#xff0c;为用户提供图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于监控系统…

阿里云数据库polardb怎么收费?

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

搭建flink集群 —— 筑梦之路

Apache Flink 是一个框架和分布式处理引擎&#xff0c; 用于在无边界和有边界数据流上进行有状态的计算。 Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 Flink并没有依靠自身实现所有分布式系统需要解决的问题&#xff0c; 而是在已有集群…