服务器开发学习 -- 异步双缓冲日志系统

本文介绍了一个异步双缓冲日志系统的设计,包括AppendFile、LogFile、LogStream、FixedBuffer、Logger和AsyncLogging组件。LogStream用于格式化输出,Logger提供对外接口,AsyncLogging启动单独线程负责日志写入。系统使用双缓冲技术提高效率,设有不同的日志级别,如TRACE、DEBUG、INFO、WARN、ERROR和FATAL。测试代码在src/base/test/log_test.cc,可以通过makefile进行编译和运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码链接:https://github.com/RaKiRaKiRa/Cyclone
通过 git clone https://github.com/RaKiRaKiRa/Cyclone.git可直接下载,有详细的注释

异步双缓冲日志系统 ,由AppendFile( base/FileUtil.h, base/FileUtil.cc ), LogFile ( base/LogFile.h, base/LogFile.cc), LogStream ( base/LogStream.h , base/LogStream.cc), FixedBuffer (base/LogStream.h), Logger (base/Logging.h , base/Logging.cc), AsyncLogging (base/AsyncLogging.h, base/AsyncLogging.cc) 组成。

双缓冲指缓冲分为前端部分与后端部分,由AsyncLogging进行调度。前端缓冲区负责接收Logger传来的日志,后端缓冲区是在以flush间隔为间隔的频率下将处理后得到的空缓冲区与前端缓冲区交换得到已收到日志,再通过LogFile存入文件中。

  • LogStream主要用来格式化输出,重载了<<运算符,同时也有自己的一块缓冲区,即为FixedBuffer,这里缓冲区的存在是为了缓存一行,把多个<<的结果连成一块。
  • Logger是对外接口,内含一个LogStream对象,主要是为了每次打log的时候在log之前和之后加上固定的格式化的信息,比如打log的行、文件名、时间、日志等级等信息。
  • Logger通过建立匿名对象进行使用,在析构函数中调用指定函数将内含LogStream的缓冲区输出到指定函数。默认输出到stdout
  • FileUtil是最底层的文件类,封装了Log文件的打开、写入并在类析构的时候关闭文件,底层使用了标准IO,该append函数直接向文件写。使用setbuffer设置用户行缓存区。
  • LogFile进一步封装了FileUtil,设置了Roll和Flush策略。
    • roll即更换文件进行存储日志,策略为已写入指定行数或到达第二天后执行
    • flush即冲洗流中的信息进入文件,策略为间隔指定事件(默认为3秒)
  • AsyncLogging是核心,它负责启动一个log线程,专门用来将log写入LogFile
    • AsyncLogging负责(定时到或被填满时)将缓冲区中的数据写入LogFile中,需要事先通过setOutput将AsyncLogging::append()绑定给Logger。
    • 应用了“双缓冲技术”(指前后端),其实有4个以上的缓冲区(前端 后端各两个)。使新建日志时不必等待磁盘文件操作,也避免每个新日志消息都唤醒后端日志线程,减少开销。
    • 前端缓冲区负责接收Logger传来的日志,后端缓冲区是在以flush间隔为间隔的频率下将处理后得到的空缓冲区与前端缓冲区交换得到日志,再通过LogFile存入文件中。
  • 将日志分为TRACE , DEBUG , INFO , WARN , ERROR , FATAL六个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值