当前位置: 首页 > news >正文

【同步/异步 日志系统】--- 介绍

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:        9ilk

(๑•́ ₃ •̀๑) 文章专栏:     项目 


本篇博客主要对基于多设计模式下的同步&&异步日志系统这个项目的基本介绍,包括技术栈,日志系统的必要性,以及基本的实现思想。

为什么做这个项目

    在进行服务器程序调试的时候涉及到多线程,多进程等, 出现bug难以定位 , 此时就可以借助日志系统打印帮助定位。之前我简单封装的宏日志打印工具只是单纯使用单线程来执行日志语句的输出,简单的输出到控制台上,这样才能执行后面的业务逻辑,这样的效率无疑是低下的,同时日志输出方向比较死板以及格式不易扩展。

#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL DBG
#define LOG(level,format,...) do{\if(level < LOG_LEVEL) break;\   time_t t = time(NULL);\struct tm* ltm = localtime(&t);\char temp[32] = {0};\strftime(temp,32,"%H:%M:%S",ltm);\fprintf(stdout,"[%s %s:%d] " format "\n",temp,__FILE__,__LINE__,##__VA_ARGS__);\
}while(0)
#define INF_LOG(format,...) LOG(INF,format,##__VA_ARGS__)
#define DBG_LOG(format,...) LOG(DBG,format,##__VA_ARGS__)
#define ERR_LOG(format,...) LOG(ERR,format,##__VA_ARGS__) 

   在学习和使用了优秀的日志系统,比如spdlog,zlog等日志系统 , 打算做这个高性能的日志系统组件项目, 应用到日志打印工作中,该日志系统亮点是,异步日志的缓冲区主要使用了异步双缓冲区的思想,外界将任务数据添加到输入缓冲区中,异步线程对处理缓冲区中的数据进行处理,若处理缓冲区中没有数据了则交换缓冲区。同时该项目支持创建不同类型的日志器,以及支持不同的日志落地方向,更能让用户自己扩展等

日志系统实现思想

日志系统的技术主要包括三种类型 :

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

1. 同步写日志(直接写磁盘)

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

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

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

2. 异步写日志(需要设计缓冲区和异步线程)

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

此时即使日志没有真正的落地也不影响程序的主业务, 大大提高程序的性能:

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

项目日志系统支持功能

  • 支持多级别的日志消息(只输出高于某级别的日志)
  • 支持同步日志和异步日志(同步:将日志写入到文件、数据库由我自己这个业务线程干;异步:日志放到内容,由其他工作线程进行实际输出)
  • 支持可靠写入日志到控制台、文件以及滚动文件中。
  • 支持多线程程序并发写到日志。
  • 支持扩展不同的日志落地目标地。(日志输出可以落地到标准输出,文件,切换文件,也可以同时进行,还支持扩展,比如写入到数据库,或发送给日志发送服务器)

项目技术栈

开发环境:

  • Ubuntu 22.04
  • vscode / vim
  • g++ / gdb
  • MakeFile

关键技术:

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

http://www.dtcms.com/a/512160.html

相关文章:

  • 【软考备考】 数据与文件的加解密种类详解和使用场景
  • GitLab 版本控制与管理指南
  • Python动态方法调用全解:从字符串到执行的艺术
  • Blender入门学习03
  • 网站建设龙兵科技嘉兴网站建设网站建设
  • html代码下载网站怎么优化关键词
  • Kafka面试精讲 Day 27:监控告警与故障排查
  • C++ ABI:编译报错之:gcc 4.8.1 切 gcc 6.1.0
  • OLED-on-silicon(OLEDoS)技术正成为VR/MR设备显示技术的未来大趋势
  • QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
  • 网站制作全包多少钱演出票务网站建设
  • 用 Go 手搓一个 NTP 服务:从“时间混乱“到“精准同步“的奇幻之旅
  • 如何设计一个高并发系统?
  • 仓颉语言核心技术全解析与实战教程
  • 【多维聚类算法】RQ-Kmeans 利用残差信息 捕捉细节特征
  • 【代码随想录算法训练营——Day44】动态规划——1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列
  • 北住房和城乡建设厅网站亦庄建设局网站
  • 做生鲜食品最好的网站深圳网站建设犀牛云
  • Spring—容器
  • 汉南公司网站建设山东定制版网站建设公司
  • .NET WinForms + WPF 综合学习路线:从传统到现代的.NET桌面开发
  • 怀柔做网站设计师网上接单被骗
  • Go语言实战:入门篇-4:与数据库、redis、消息队列、API
  • Go语言:一文学搞懂核心函数“make”
  • 什么网站是教做纸工的测量为什么要建站
  • 徐州专业做网站的提高自己网站
  • FFmpeg--FlvPaser源码解析
  • html+js 实现生活缴费页面模板
  • Linux小课堂: 定时与延时执行机制之date、at、sleep 与 crontab 的深度解析
  • Linux第二弹