第5章高效的多线程日志

异步日志

日志系统可分为前端和后端两个部分:其中前端提供应用程序使用的接口,并生成日志消息;后端则负责把日志消息写到目的地

日志系统是一个典型的多生产者-单消费者问题

多线程程序要求日志库线程安全,即多个程序可以并发写日志,两个线程的日志消息不会出现交叉。

用一个背景线程收集日志消息,并写入日志文件,其他业务线程只管往这个日志线程发送日志消息,这称为异步日志(非阻塞日志)

muduo日志库使用双缓冲技术,准备两块buffer,A和B。前端负责往buffer A填数据(日志消息),后端负责将buffer B的数据写入文件;当buffer A写满之后,交换A和B,让后端将buffer A的数据写入文件,而前端则往buffer B填入新的消息,如此往复

使用两个buffer的好处是在新建日志消息的时候不必等待磁盘文件操作,也避免每条新日志消息都出发后端日志线程。前端不是将一条条日志消息分别发送到后端,而是将多条日志消息拼接成一个大的buffer传送给后端,相当于批处理,减少了线程唤醒的开销

除此之外,为了及时将消息写入文件,即使前端的buffer A未写满,日志库也会每三秒执行一次上述交换写入操作

双缓冲异步日志的相关问题

  • 什么时候切换写到另一个日志文件?前一个buffer已经写满了,则交换两个buffer(写满的buffer置空)
  • 日志串写入过多,日志线程来不及消费,怎么办?直接丢掉多余的日志buffer,腾出内存,防止引起程序故障
  • 什么时候唤醒日志线程从Buffer中取数据?其一是超时,其二是前端写满了一个或者多个buffer

高效的多线程日志

“日志”主要指

  • 诊断日志:常用日志库提供的日志功能。
  • 交易日志:用于记录状态变更,通过回放日志可以逐步恢复每一次修改之后的状态。

对于关键进程,日志通常需要记录

  1. 收到的每条内部消息的id
  2. 收到的每条外部信息的全文;
  3. 发出的每条消息的全文,每条消息都有全局唯一的id
  4. 关键内部状态的变更;

一个日志库可以分为前端和后端两部分。前端是供应用程序使用的接口(API),并生成日志消息;后端负责把日志消息写到目的地

在多线程程序中,前端和后端都与单线程程序没有什么区别,无非是每个

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值