日志系统:
日志:程序在运行过程中,用来记录程序运行状态信息。
作用:记录了程序运行状态信息,以便程序员能够随时根据状态信息,对系统程序的运行状态进行分析。
本项目主要实现的是一个日志系统,其支持以下功能:
本项⽬不依赖其他任何第三⽅库, 只需要安装好CentOS / Ubuntu + vscode / vim环境即可开发。
日志系统的技术实现主要包括三种类型:
- 利用printf、std::cout等输出函数将日志信息打印到控制台。
- 对于大型商业化项目,为了方便排查问题,我们一般会将日志输出到文件或者是数据库系统方便查询和分析日志,主要分为同步日志和异步日志方式。
同步日志指的是当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑语句,日志输出语句与程序的业务逻辑语句将在同一个线程中运行。每次调用一次打印日志API就对应一次系统调用write写日志文件。
在高并发的场景下,随着日志数量多不断增加,同步日志系统容易产生系统瓶颈:
- 一方面,大量的日志打印陷入等量的write系统调用,具有一定的系统开销。
- 另一方面,使得打印日志的进程附带了大量同步的磁盘IO,影响程序性能。
异步日志是指在进行日志输出时,日志输出语句与业务逻辑语句并不是在同一个线程中运行,而是有专门的线程用于进行日志输出操作,业务线程只需要将日志放到一个内存缓冲区中,不需要等待即可继续执行后续业务逻辑(作为日志的生产者),而日志的落地操作交给单独的日志线程完成(作为日志的消费者),这是一个典型的生产-消费模型。
这样的好处是即使日志没有真正的完成输出也不会影响程序的主业务,提高程序的性能
- 主线程调用日志打印接口成为非阻塞操作
- 同步的磁盘IO操作从主线程剥离出来交给单独的线程完成。