实战项目——基于多设计模式下的同步异步日志系统

系列文章目录

1.项目介绍

2.相关技术补充

3.日志系统框架

4.代码设计

5.功能测试

6.性能测试


文章目录

目录

系列文章目录

1.项目介绍

2.相关技术补充

3.日志系统框架

4.代码设计

5.功能测试

6.性能测试

文章目录

前言

一、项目介绍

二、开发环境

三、核心技术

四、日志系统介绍

日志系统的技术实现

同步日志

异步日志

总结


前言

为什么需要日志系统

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

一、项目介绍

本项目主要实现一个日志系统,其主要支持以下功能:

  • 支持多级别日志消息
  • 支持同步和异步日志
  • 支持可靠写入日志到控制台、文件以及滚动文件中
  • 支持多线程程序并发写日志
  • 支持扩展不同的日志落地目标地

二、开发环境

  • centos7
  • vscode/vim
  • g++/gdb
  • Makefile

三、核心技术

  • 类层次设计(继承和多态的应用)
  • C++11的特性(多线程、auto、智能指针、右值引用等)
  • 双缓冲区
  • 生产消费模型
  • 多线程
  • 设计模式(单例、工厂、代理、模板等)

四、日志系统介绍

日志系统的技术实现

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

同步日志

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

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

一方面,大量的日志陷入等量的write系统调用,有一定的系统开销

一方面,使得打印日志的进程附带了大量同步磁盘IO,影响了程序性能

异步日志

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

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

主线程调用日志打印接口成为非阻塞操作

同步的磁盘IO从主线程中剥离出来交给单独的线程完成。


总结

本节主要介绍了日志系统的概要,详情请见后续文章。

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

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

相关文章

Ubuntu更改虚拟机网段(改成桥接模式无法连接网络)

因为工作需要,一开始在安装vmware和虚拟机时,是用的Nat网络。 现在需要修改虚拟机网段,把ip设置成和Windows端同一网段,我们就要去使用桥接模式。 环境: Windows10、Ubuntu20.04虚拟机编辑里打开虚拟网络编辑器&#…

7.Docker-compose

文章目录 Docker-compose概念Docker-compose部署YAML文件格式和编写注意事项注意数据结构对象映射序列属组布尔值序列的映射映射的映射JSON格式文本换行锚点和引用 Docker compose配置常用字段docker compose常用命令Docker Compose 文件结构docker compose部署apachedocker co…

Ubuntu Server版 之 mysql 系列(-),安装、远程连接,mysql 创建用户、授权等

Ubuntu 分 桌面版 和 服务版 桌面版 :有额外的简易界面 服务版:是纯黑框的。没有任何UI界面的可言 安装mysql 安装位置 一般按照的位置存放在 /usr/bin 中 sudo apt-get install mysql-server退出程序或应用 exit 或 Ctrl D 查看mysql的状态 servic…

springboot参数校验

springboot参数传递 PathVariableRequestParamRequestBody JSR303 jsr303 : 也称 bean validation 规范,用于java bean 验证的标准API,,他定义了一组注解,可以在javabean 的属性上声明验证规则 JSR: ja…

【Android安全】Embedded Trace Microcell模块

ETM: Embedded Trace Macrocell, hardware unit responsible to generate hardware instruction trace. ETM模块用于在硬件层面实现instruction trace,可用于辅助逆向分析。 使用教程: https://mcuoneclipse.com/2016/11/05/tutorial-getting-etm-inst…

鸿鹄协助管理华为云与炎凰Ichiban

炎凰对华为云的需求 在炎凰日常的开发中,对于服务器上的需求,我们基本都是采用云服务。目前我们主要选择的是华为云,华为云的云主机比较稳定,提供的云主机配置也比较多样,非常适合对于不同场景硬件配置的需求&#xff…

Java IO,BIO、NIO、AIO

操作系统中的 I/O 以上是 Java 对操作系统的各种 IO 模型的封装,【文件的输入、输出】在文件处理时,其实依赖操作系统层面的 IO 操作实现的。【把磁盘的数据读到内存种】操作系统中的 IO 有 5 种: 阻塞、 非阻塞、【轮询】 异步、 IO复…

NLP From Scratch: 生成名称与字符级RNN

NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在<cite>第一个教程< / intermediate / char_rnn_classification_tutorial ></cite> 中&#xff0c;我们使用了 RNN 将名称分类为来源语言。 这次&#xff…

Java泛型

文章目录 1. 泛型入门1.1 定义简单泛型类1.2 泛型方法1.3 限定类型变量 2. 擦除和转换2.1 类型擦除 3. 类型通配符3.1 通配符上限3.2 通配符下限3.3 例子 4. java的Type4.1 UML总览 1. 泛型入门 泛型的英文名Generic&#xff0c;java5以后&#xff0c;引入参数化类型&#xff…

原型模式——对象的克隆

1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 在使用原型模式时&#xff0c;需要首先创建一个原型对象&#xff0c;再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式&#xff08;Prototype Patt…

14.python设计模式【模板方法模式】

内容&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色&#xff1a; 抽象类&#xff08;AbstractClass&#xff09;&#xff1a;定义抽象的原子操作&#xff08;钩子…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v9.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、标准Java平台&#xff0c;服务端基于Netty编写。 工程开源地址是&am…

HTML5前端开发工程师的岗位职责说明(合集)

HTML5前端开发工程师的岗位职责说明1 职责 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5相关技术开发移动平台的web前端页面; 2、基于HTML5.0标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、持续的优化前端体验和页面响应速度&#xff0c;并保证兼容性和…

【论文阅读】Feature Inference Attack on Shapley Values

摘要 研究背景 近年来&#xff0c;解释性机器学习逐渐成为一个热门的研究领域。解释性机器学习可以帮助我们理解机器学习模型是如何进行预测的&#xff0c;它可以提高模型的可信度和可解释性。Shapley值是一种解释机器学习模型预测结果的方法&#xff0c;它可以计算每个特征对…

了解Unity编辑器之组件篇Scripts(六)

Scripts&#xff1a;有Unity提供的一些脚本插件&#xff08;自己新建的脚本也会出现在里面&#xff09; 一、TMPro&#xff1a;有一些与文字显示和排版相关的脚本 1.TextContainer&#xff08;文本容器&#xff09;&#xff1a;TextContainer 是一个内容框&#xff0c;用于定…

AIGC人工智能辅助开发:提升效率、优化代码、实现智能编程

文章目录 1. 什么是AIGC人工智能辅助开发&#xff1f;2. AIGC的优势和应用场景2.1 提升开发效率2.2 优化代码质量2.3 实现智能编程 3. 如何用好AIGC人工智能辅助开发&#xff1f;3.1 选择合适的AIGC工具3.2 理解AIGC的工作原理3.3 逐步应用AIGC辅助开发3.4 主动参与AIGC的学习和…

AI工程师的崛起:填补AI革命中的空白

在一个拥有大约5000名语言学习模型&#xff08;LLM&#xff09;研究员&#xff0c;但大约有5000万软件工程师的世界中&#xff0c;供应限制决定了一种新型专业人才—AI工程师的迅猛增长。他们的崛起不仅仅是一种预测&#xff0c;更是对科技世界动态变化的必然反应。AI工程师作为…

【Linux】-进程概念及初始fork

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0

&#x1f989; AI新闻 &#x1f680; Stability AI推出最先进的AI工具Stable Diffusion XL 1.0 摘要&#xff1a;Stability AI宣布推出Stable Diffusion XL 1.0&#xff0c;该版本是其迄今为止最先进的AI工具。Stable Diffusion XL 1.0提供更鲜艳、更准确的图片生成&#xff…

Python开发之手动实现一维线性插值

Python开发之手动实现一维线性插值 1.线性插值法介绍2.手动实现线性插值3.案例一&#xff1a;手动实现线性插值4.使用pandas的插值方法实现要求(推荐)5.案例二&#xff1a;对一组数据进行线性插值和SG滤波处理 前言&#xff1a;主要介绍手动实现一维线性插值以及pandas里面的in…