C++项目实战——基于多设计模式下的同步异步日志系统-①-项目介绍

news/2024/7/24 10:11:54 标签: c++, 设计模式, 开发语言

文章目录

  • 专栏导读
  • 项目介绍
  • 开发环境
  • 核心技术
  • 环境搭建
  • 日志系统介绍
    • 1.为什么需要日志系统
    • 2.日志系统技术实现
      • 2.1同步写日志
      • 2.2异步写日志

专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 C++项目——基于多设计模式下的同步与异步日志系统

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法Linux

在这里插入图片描述

项目介绍

  • 本项目为实现一个日志系统,支持以下功能:
    • 支持多级别日志消息
    • 支持同步日志异步日志
    • 支持可靠写入日志到标准输出指定文件以及滚动文件中;
    • 支持多线程并发写日志;
    • 支持拓展不同的日志落地方向

开发环境

  • CentOS 7;
  • vscode/vim;
  • g++;
  • Makefile;

核心技术

  • 继承和多态;
  • C++11(多线程、auto、智能指针、右值引用、包装器、lambda等);
  • 双缓冲区;
  • 生产消费模型;
  • 多线程;
  • 设计模式(单例、工厂、代理、建造者);

环境搭建

本项目不需要依赖任何第三方库。

日志系统介绍

1.为什么需要日志系统

  • 生产环境的产品为了保证其稳定性及安全性是不允许开发人员附加调试器去排查问题,可以借助日
    志系统来打印一些日志帮助开发人员解决问题;
  • 上线客户端的产品出现bug无法修复并解决,可以借助日志系统打印日志并上传到服务器端帮助开发人员进行分析;
  • 对于一些高频操作(如定时器、心跳包)在少量调试次数下可能无法触发我们想要的行为,通过断点的暂停方式,我们不得不重复操作几十次、上百次甚至更多,导致排查问题效率是非常低下,可以借助打印日志的方式查问题;
  • 分布式、多线程/多进程的代码中、出现bug比较难以定位,可以借助日志系统打印log帮助定位bug
  • 帮助首次接触项目代码的新开发人员理解代码的运行流程;

2.日志系统技术实现

日志系统的技术实现包括三种类型:

  • 利用printfstd::cout 等输出函数将日志信息打印到控制台
  • 对于大型商业化项目,为了方便排查问题,我们一般会将日志输出到文件或者是数据库系统方便查询和分析日志,主要分为同步日志异步日志方式;
    • 同步写日志;
    • 异步写日志;

2.1同步写日志

  • 同步日志是指当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑与语句,日志输出语句将在同一个线程运行。每次调用一次打印日志API就对应一次系统调用write写日志文件。

在这里插入图片描述

在高并发场景下,随着日志数量不断增加,同步日志系统很容易产生系统瓶颈:

  • 一方面,大量的日志打印陷入等量的write系统调用,有一定的系统开销
  • 另一方面,使得打印日志的进程附带了大量同步的磁盘IO,影响程序性能

2.2异步写日志

异步日志是指在进行日志输出时,日志输出语句与业务逻辑语句并不是在同一个线程中运行的,而是有专门的线程用于日志输出操作。业务线程只需要将日志放到一个内存缓冲区中不用等待即可继续后续业务逻辑(作为日志的生产者),而日志的落地操作交给单独的日志线程屈去完成(作为日志的消费者),这是一个典型的生产消费模型

在这里插入图片描述

这样做的好处是即使日志没有真正的完成输出也不影响程序的主业务,可以提高程序的性能:

  • 主线程调用日志打印接口成为非阻塞操作
  • 同步的磁盘IO从主线程中剥离出来交给单独的线程完成

在这里插入图片描述


http://www.niftyadmin.cn/n/5009257.html

相关文章

Python|OpenCV-色彩空间之RGB轨迹调试板(5)

前言 本文是该专栏的第5篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 通常情况下,在处理图像需求的时候,需要掌握多个色彩空间的知识点。现实中,我们肉眼可以看到多种颜色,色彩是人的眼睛对于不同频率的光线的不同感受,其既是客观存在的,也是主观感知的。…

仅做笔记用:Civitai 通过 API 下载模型

域名和 web 网站的域名一样 搜索模型:GET /api/v1/models 常用参数(都是可选): tag标签query标题(模糊查询)page页数limit每页大小username作者用户名types模型类型 (Checkpoint, TextualInversion, Hyp…

AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想

TiDB Hackathon 2023 刚刚结束,我仔细地审阅了所有的项目。 在并未强调项目必须使用人工智能(AI)相关技术的情况下,引人注目的项目几乎一致地都使用了 AI 来构建自己的应用。 大规模语言模型(LLM)的问世使得…

STM32 FreeRTOS 内存问题

1. STM32L151C8T6 内存,64Kb 的Flash(代码就是烧录在这里面的),16Kb 的RAM,程序跑起来之后的内存,相当于我们高考时发的草稿纸,直接影响程序的运行速度,可以用STM32 CubeMx 软件直接…

【数据仓库基础(二)】数据仓库架构

文章目录 一. 基本架构二. 主要数据仓库架构1. 数据集市架构1.1. 独立数据集市1.2. 从属数据集市1.3. Inmon企业信息工厂架构 2. Kimball数据仓库架构3. 混合型数据仓库架构 三. 操作数据存储(ODS) 一. 基本架构 架构是指系统的一个或多个结构。结构中包…

ARM/X86工业级数据采集 (DAQ) 与控制产品解决方案

I/O设备,包括信号调理模块、嵌入式PCI/PCIE卡、便携式USB模块、DAQ嵌入式计算机、模块化DAQ系统,以及DAQNavi/SDK软件开发包和DAQNavi/MCM设备状态监测软件。 工业I/O产品适用于各种工业自动化应用,从机器自动化控制、测试测量到设备状态监测…

SpringBoot+MySQL+Vue前后端分离的宠物领养救助管理系统(附论文)

文章目录 项目介绍主要功能截图:后台:登录个人中心宠物用品管理宠物领养管理用户管理用户领养管理宠物挂失管理论坛管理系统管理订单管理前台首页宠物挂失论坛信息宠物资讯部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创

对时序数据进行分类与聚类

我在最近的工作中遇到了一个问题,问题是我需要根据银行账户在一定时间内的使用信息对该账户在未来的一段时间是否会被销户进行预测。这是一个双元值的分类问题,只有两种可能,即会被销户和不会被销户。针对这个问题一般来说有两种解决策略。 …