【1】基于多设计模式下的同步异步日志系统-项目介绍

news2025/2/26 20:02:45

1. 项目介绍

本项⽬主要实现⼀个日志系统, 其主要支持以下功能:
• 支持多级别日志消息
• 支持同步日志和异步日志
• 支持可靠写⼊日志到控制台、文件以及滚动文件中
• 支持多线程程序并发写日志
• 支持扩展不同的日志落地⽬标地

2. 开发环境

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

3. 核心技术

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

4. 环境搭建

本项⽬不依赖其他任何第三方库, 只需要安装好CentOS/Ubuntu + vscode/vim环境即可开发。

5. 日志系统介绍

5.1 为什么需要日志系统

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

5.2 日志系统技术实现

日志系统的技术实现主要包括三种类型:
• 利用printf、std::cout等输出函数将日志信息打印到控制台
• 对于⼤型商业化项⽬, 为了方便排查问题,我们⼀般会将日志输出到文件或者是数据库系统方便查询和分析日志, 主要分为同步日志和异步日志方式
◦ 同步写日志
◦ 异步写日志

5.2.1 同步写日志

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

在这里插入图片描述

在高并发场景下,随着日志数量不断增加,同步日志系统容易产生系统瓶颈:
• ⼀方⾯,⼤量的日志打印陷⼊等量的write系统调用,有⼀定系统开销.
• 另⼀方⾯,使得打印日志的进程附带了⼤量同步的磁盘IO,影响程序性能

5.2.2 异步写日志

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

在这里插入图片描述

这样做的好处是即使日志没有真的地完成输出也不会影响程序的主业务,可以提高程序的性能:
• 主线程调用日志打印接口成为⾮阻塞操作
• 同步的磁盘IO从主线程中剥离出来交给单独的线程完成

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

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

相关文章

Node版本管理nvm工具安装及使用问题

安装和配置 下载地址 nvm官方下载window环境直接下nvm-setup.zip解压安装即可。 安装效验以及镜像配置 在cmd中,输入nvm -v 会反馈相应的安装版本,即表示安装成功。配置镜像源: nvm node_mirror https://npm.taobao.org/mirrors/node/ nvm npm_mir…

GitHub上1.5K标星的QA和软件测试学习路线图

​最近在GitHub上发现一个项目,项目描述了作为QA工程师,进行软件测试技能提升时的,建议的软件测试学习顺序图​。 虽然2021年起就不再更新了,但是居然有1.5K的​星。 整个项目有两个部分​: ​1.QA和软件测试学习顺序…

线程池大小设置多少,比较合适?

设置线程数的核心点 压测!压测!再压测!实际对性能要求比较高的场景,压测是最佳的方式! 并发编程适用于什么场景? CPU 密集型 对于 CPU 密集型任务,希望最大限度地提高 CPU 利用率&#xff0c…

使用String.valueOf()的坑

说明:记录一次使用String.valueOf()的坑,以下是一段有问题的代码: String count String.valueOf(listData.get(0).get(0).get("count");if (StringUtils.isBlank(count) || "0".equals(count)) {result.setResult(page)…

LLM推理部署(五):AirLLM使用4G显存即可在70B大模型上进行推理

众所周知,大模型的训练和推理需要大量的GPU资源,70B参数的大模型需要130G的GPU显存来存储,需要两个A100(显存为100G)。 ​ 在推理过程中,整个输入序列也需要加载到内存中进行复杂的“注意力”计算&am…

【WinForm.NET开发】演示:创建一个图片查看器 Windows 窗体应用

本文演示将创建一个 Windows 窗体应用程序,用于加载和显示图片。 Visual Studio 集成设计环境 (IDE) 提供了创建应用所需的工具。 1、先决条件 若要完成本教程,必须具有 Visual Studio。 请访问Visual Studio 下载页获取免费版本。 2、创建 Windows …

C语言扫雷游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、扫雷游戏的分析和设计1.1扫雷游戏的功能说明1.2数据结构的分析1.3文件结构设计 二、扫雷游戏的代码实现总结 前言 详细介绍扫雷游戏的思路和实现过程。 一…

基于Java SSM框架实现美好生活九宫格日志网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现美好生活九宫格日志网站系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人…

风险评估有什么用

风险评估就是量化测评某一事件或事物带来的影响或损失的可能程度。 为什么要做风险评估? 1.更准确地认识风险-系统地评估资产风险事件发生的概率大小和概率分布,及发生后损失的严重程度。帮助区分主要风险和次要风险。 2.保证规划的合理性和可行性-正确反映各风…

【开源】基于Vue.js的智慧社区业务综合平台

文末获取源码,项目编号: S 077 。 \color{red}{文末获取源码,项目编号:S077。} 文末获取源码,项目编号:S077。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预…

网络安全--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统(平台)的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括:靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

Java 学习之多态

多态的概念 多态 晚绑定。 所谓多态,就是父类型的引用可以指向子类型的对象,或者接口类型的引用可以指向实现该接口的类的实例。 不要把函数重载理解为多态。因为多态是一种运行期的行为,不是编译期的行为。 多态:父类型的引用可…

保育员个人简历精选7篇

想要在保育员职位的求职过程中脱颖而出吗,参考这7篇精选的保育员简历案例!无论您的经验如何,都能找到适合自己的简历样式及参考内容。 保育员个人简历模板下载(可在线编辑制作):来幻主简历,做好…

Shell循环:expect(二)

expect实战:公钥推送 一、准备工作:安装expect,装备公钥 二、通过shell循环判断主机在线 #!/bin/bash #脚本编写 #创建一个IP地址文件 >ip.txt #使用for循环ping测试主机是否在线 for i in {3..254} do{ip192.168.151.$iping -c1 -W…

矢量图形设计软件CorelDRAW 2023 mac界面说明

CorelDRAW 2023 mac是一款专业的矢量图形设计软件,由Corel公司开发。它提供了广泛的创意工具和功能,旨在满足设计师、艺术家和创意专业人士的需求。 CorelDRAW 2023具有直观的用户界面和工作流程,使用户能够轻松创建各种类型的图形设计&#…

三十六、seata的部署和集成

seata的部署和集成 一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包,地址在http😕/seata.io/zh-cn/blog/download.html 当然,资料也准备好了: 2.解压 在非中文目录解压缩这个zip包,其目录结构如下…

如何开启Windows Server 2016 远端桌面

使用GUI 设定 服务器管理器–> 本地服务器–> 远端桌面 启用远端桌面 远端–> 允许远端连线至此电脑 会提示防火墙设定跟电源设定 防火墙之前已经关闭了 完成

线程中出现异常的处理

目录 前言 正文 1.线程出现异常的默认行为 2.使用 setUncaughtExceptionHandler() 方法进行异常处理 3.使用 setDefaultUncaughtExceptionHandler() 方法进行异常处理 4.线程组内处理异常 5.线程异常处理的优先性 总结 前言 在紧密交织的多线程环境中,异…

游戏配置表的导入使用

游戏配置表是游戏策划的标配,如下图: 那么程序怎么把把这张配置表导入使用? 1.首先,利用命令行把Excel格式的文件转化成Json格式: json-excel\json-excel json Tables\ Data\copy Data\CharacterDefine.txt ..\Cli…

如何从 Jira 成功迁移到极狐GitLab,看这个就够了!

内容来源:https://about.gitlab.com/blog 作者:Melissa Ushakov Atlassian 之前表示,到 2024 年 2 月会全面终止对于其服务器端产品的支持。 随着 Jira Server 的生命周期即将结束,众多组织都在考虑将其敏捷项目管理工具从Jira 迁…