首页 > 其他分享 >开源组件——异步日志方案 spdlog 的讲解

开源组件——异步日志方案 spdlog 的讲解

时间:2024-08-22 09:25:29浏览次数:6  
标签:info 异步 输出 开源 spdlog basic 日志

一:日志的作用

1、定义

        日志(Log)是记录系统中发生的事件或操作的详细信息的文件或数据流。这些事件或操作可能包括程序执行、系统错误、用户活动、安全事件等日志(Log)是记录系统中发生的事件或操作的详细信息的文件或数据流。这些事件或操作可能包括程序执行、系统错误、用户活动、安全事件等。其中可以带来以下作用:

        1:可以追踪程序的运行状态。

        2:当出现问题之后可以提供现场运行的信息:包括所在文件,行号,所在线程等。

        3:分析性能瓶颈和潜在系统故障。

2、异步日志和同步日志

        我们都知道打印输出是IO操作,是很浪费时间的,那我们可不可以把这个打印输出作为一种耗时操作放入到线程池中去呢,作为异步操作执行呢?

        答案是当然可以,我们将这个打印作为一个任务,放入到线程池中去执行,不会占用核心线程,提高性能。

        但是异步打印有一些问题所在,比如异步打印中,我们如何保证时间的准确?在并发中我们如何做到顺序打印(并发乱序问题)?

        对于时间的准确,这个容易解决,可以在打包任务的时候,就将时间进行携带,这样保证时间的准确性。而并发乱序问题,我们在每次打印的时候在这条信息前面加入排序号,我们可以通过后面使用输出排序进行按顺序打印,比如通过Linux下sort的命令进行按顺序查看。

二、spdlog

1、spdlog 介绍

        spdlog 是一款高效的 C++ 日志库,它以其极高的性能和零成本的抽象而著称。spdlog 支持异步和同步日志记录,提供多种日志级别,并允许用户将日志输出到控制台、文件或自定义的接收器。

2、spdlog 为什么高效

        spdlog 的设计哲学是尽量减少日志记录的开销,即使在高负载 的情况下也能保持高性能。它通过以下几种方式实现这一点:

        零成本抽象:spdlog 通过模板和内联函数来实现零成本抽象, 确保只有在真正需要时才进行日志记录。

        异步日志记录:spdlog 支持异步日志记录,这意味着它可以将日志消息发送到线程池进行处理,从而减少对主线程性能的影响。

        高效地格式化:spdlog 使用 fmt 库进行高效的字符串格式化, 减少了格式化日志消息所需的时间。

3、spdlog 特征

spdlog 的性能特点使其在高性能应用中非常受欢迎:

        极高的日志记录速度: spdlog 能够在每秒记录数百万条日志消 息,这对于需要处理大量日志数据的应用来说是非常重要的。

        低内存占用: spdlog 的设计确保了即使在高负载下,它也能保持 低内存占用。

        灵活的配置: 用户可以根据需要配置 spdlog,选择异步或同步日 志记录,以及选择不同的日志级别和输出目标。

4、spdlog 的输出控制

spdlog 提供了丰富的输出控制选项,允许用户根据需要定制日志输出:

        多种日志级别: spdlog 支持多种日志级别,包括 trace、 debug、info、warn、error 和 critical,用户可以根据需要选择 合适的日志级别。

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

        格式化输出: spdlog 支持格式化输出,允许用户以结构化的方式 输出日志消息。

5、spdlog 处理流程

        Spdlog 的流程非常简单,但是每个组件都扮演着重要的角色。 Loggers 负责记录日志消息,Sinks 决定了日志消息的输出位 置,Formatters 负责将日志消息转换为特定格式,Async Logger 异步地将日志消息写入到目标 Sink 中,Registry 用于管理这些组件。

        其中的异步日志Async Logger还包含一个线程池,用来异步处理。Registry是用来对这些loggers进行注册使用的,相当于管理。

 三、具体使用

//默认输出到控制台
 spdlog::info("hello world");

//下面是同步和异步的写入文件的方法
auto logger1 = spdllog::basic_logger_mt("basic","basic.txt");
logger1->info("hello world from basic_sink");
spdlog::get("basic")->info("hello world from basic_sink too");

//通过异步
auto logger2 = spdllog::basic_logger_mt<spdlog::async_factory>("basic","basic.txt");
logger1->info("hello world from basic_sink");
spdlog::get("basic")->info("hello world from basic_sink too");

//通过手动搭配
auto sink1 = std::make_shared<spdlog::sinks::ansicolor_stdout_sink_mt>();
auto sink2 = std::make_shared<spdlog::sinks::basic_file_sink_mt>("mark.txt",true);

auto logger3 = std::make_shared<spdlog::logger>("self");
logger3->sinks().push_back(sink1);
logger3->sinks().push_back(sink2);
spdlog::register_logger(logger3);
logger3->info("multi sinks");


https://xxetb.xetslk.com/s/2D96kH

标签:info,异步,输出,开源,spdlog,basic,日志
From: https://blog.csdn.net/2301_76446998/article/details/141350203

相关文章

  • 神了!两个开源的高仿外卖项目!
    大家好,我是Java陈序员。今天,给大家推荐两个高仿的外卖项目!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。高仿饿了么项目简介vue2-elm——一个基于Vue2+Vuex构建具有45个页面的高仿饿了么项目,涉及注册、登录、商品展......
  • 本地快速安装运行史上最强开源LLaMa3大模型
    https://liaoxuefeng.com/blogs/all/2024-05-06-llama3/ 史上最强开源AI大模型——Meta的LLaMa3一经发布,各项指标全面逼近GPT-4。它提供了8B和70B两个版本,8B版本最低仅需4G显存即可运行,可以说是迄今为止能在本地运行的最强LLM。虽然LLaMa3对中文支持不算好,但HuggingFace上很快......
  • iLogtail 开源两周年:感恩遇见,畅想未来
    早在上世纪60年代,早期的计算机(例如ENIAC和IBM的大型机)在操作过程中会输出一些基本的状态信息和错误报告,这些记录通常通过打印机输出到纸带或纸卡上,用于跟踪操作流程和调试,最早期的日志系统借此诞生。纵观IT发展几十年历程,以日志为代表的可观测以及监控技术在IT技术演变......
  • HTN7862 4V~65V输入,2.8A异步降压变换器
    1、特点 2.8A降压,内置260mΩ功率管输入电压范围:4V~65V脉冲跳跃模式使得轻载下高效率·110uA静态电流最高2MHZ可编程开关频率峰值电流控制架构欠压保护、过流保护和过热关断保护无铅封装,ESOP82、应用·12V,24V,48V工业和电信电源轨系统·汽车系统分布式电源系统高......
  • 【源码解析】C/C++开源代码解析引擎
    1. 背景说明针对Simulink或其他MBD环境的模型生成代码,及其他的外部C/C++代码工程,做相应的后端代码优化处理工作,例如如下场景,统计代码内的全局变量声明及其内存占用情况;提取代码内的逻辑判断条件结合Z3Prover定理证明器进行形式化验证;...因此需要对C/C++代码进行语法......
  • 异步编程CompletableFuture的一些使用demo
      publicstaticThreadPoolExecutorexecutor=newThreadPoolExecutor(5,5,5L,TimeUnit.SECONDS,newLinkedBlockingQueue<>(1000),newThreadPoolExecutor.CallerRunsPolicy());publicstaticvoidmain(String[]args)throwsException{Complet......
  • 异步交互技术Ajax-Axios
    目录一、同步交互和异步交互二、Ajax 1.概述2.如何实现ajax请求三、异步传输数据乱码的问题regist.html页面代码 服务端代码处理四、Axios1. Axios的基本使用(1)引入Axios文件(2)使用Axios发送请求,并获取响应结果。2.案例3.请求方法的别名(推荐用这个,简单)一、同......
  • 知名开源工具被用于诈骗,作者无奈清空代码。。
    小道消息,知名开源下载工具Aria的开发者最近删除了整个GitHub仓库的源代码,并且在项目介绍文件中留下了这样一段话:开发者表示,因为自己的开源项目被诈骗份子使用,导致自己被跨省(是指网民因为在网上做出一些被认为是过激行为而遭到抓捕的情况),所以永久删除本项目源代码。从项目介......
  • PHP8.1新增的异步HTTP客户端
    php8.1新增的异步http客户端随着互联网的快速发展,各种Web应用程序的性能也变得越来越重要。为了提供更好的用户体验,开发人员需要使用高效的工具和技术来处理各种网络请求。幸运的是,PHP8.1引入了一个全新的功能,即异步HTTP客户端,它允许我们以非阻塞的方式执行HTTP请求,从而提高应用......
  • .NET 智能组件完全开源
    DanielRoth在2024年3月20日发布了一篇文章:.NET智能组件简介–AI驱动的UI控件。文章主要介绍了.NETSmartComponents,这是一系列可以快速轻松地添加到.NET应用程序中的AI驱动的UI组件。这些组件旨在简化在现有软件中添加AI功能的过程,无需花费大量时间重新设计用户体验或研......