Mudo C++网络库第五章学习笔记
2018-10-14 16:30
302 查看
高效的多线程日志
- 日志(logging)有两个意思: 诊断日志(diagnostic log), 常用日志库提供日志功能;
- 交易日志(transaction log), 用于记录状态变更, 通过回放日志可以逐步恢复每一次修改后的状态;
-
Log Everything All The Time;
-
收到每条内部消息的ID(还可以包括关键字段、长度、hash等);
-
前端提供应用程序使用的接口(API), 并生成日志消息(log message);
-
从这个意义上讲, 日志库是个singleton模式(单例模式);
功能需求
- 日志消息有多种级别(level): TRACE、DEBUG、INFO、ERROR、FATAL等;
- 日志消息可能有多个目的地(appender), 如文件、socket、SMTP等;
- 日志消息的格式可配置(layout), 例如org.apache.log4j.PatternLayout;
- 可以设置运行时过滤器(filter), 控制不同组件的日志消息的级别和目的地;
- 质量保证(QA)测试环境的时候输出DEBUG级别的日志, 在生产环境输出INFO级别的日志;
- 只要调用muduo::Logger::setLogLevel()就能立即生效;
- 对于分布式系统中的服务进程而言, 日志的目的第(destination)只有一个:本地文件; 日志文件的滚动(rolling)是必需的, 这样可以简化日志归档(archive)的实现;
-
一般的日志库都会自动根据文件大小和时间来主动滚动日志文件;
-
其二是每条内存中的日志消息都带有cookie(或者叫哨兵值/sentry), 其值为某个函数的地址, 这样通过core dump文件中查找cookie就能找到尚未来得及写入磁盘的消息;
-
尽量每条日志占一行;
性能需求
- 日志库的高效性体现在几个方面: 每秒写上千万条日志的时候没有明显的性能损失;
- 能应对一个进程生产大量日志数据的场景, 例如1GB/min;
- 不阻塞正常的执行流程;
- 在多程序程序中, 不造成争用(contention);
- 磁盘带宽约是110MB/S, 日志库应该能瞬时写满这个带宽(不必持续太久);
- 假如每条日志消息的平均长度是110字节, 这就意味着1秒要写100万条日志;
-
时间戳字符串中的日期和时间部分是缓存的, 一秒内的多条日志只需要重新格式化微妙部分;
多线程异步日志
- 多线程程序对日志库提出了新的需求:线程安全, 即多个程序可以并发写日志, 两个线程的日志消息不会出现交织;
- 多线程的每个进程最好只写一个日志文件; 用一个背景线程收集日志消息, 并写入日志文件, 其他业务线程只管往这个日志线程发送日志消息, 这称为异步日志;
- 非阻塞日志;
-
muduo日志库采用的是双缓冲(double buffering)技术;
-
直接丢弃掉多余的日志buffer, 以腾出内存, 这样可以防止程序库本身引起程序故障, 是一种自我保护措施;
-
java的ConcurrentHashMap那样用多个桶子(bucket), 前端写日志的时候再按线程id哈希到不同的bucket中, 以减少contention(后端实现比较复杂);
相关文章推荐
- 系统架构师学习笔记_第五章(下)_连载
- <原>第五章-CoreText-学习笔记1
- Unix原理与应用学习笔记----第五章 普通文件2
- LDD3 第五章 并发与竞争 学习笔记
- 威克诺CCNA学习笔记OSI第五章
- java设计模式学习笔记第五章
- JavaScript学习笔记--第五章.其它
- DirectShow 学习笔记__第五章——Diectshow应用开发过程
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
- 深入.NET平台和C#编程 第五章 学习笔记
- Python基础教程学习笔记----第五章 条件、循环和其他语句
- 《Linux内核设计与实现》第五章学习笔记
- python-MySQL学习笔记-第五章-利用Connector/Python来修改数据库
- C++标准程序库 学习笔记 第五章 STL(标准模板库概述)
- Head first HTML&CSS ---[学习笔记第五章]
- C++ Primer 学习笔记(第五章:语句)
- Unix原理与应用学习笔记----第五章 普通文件3
- 《HTML & XHTML权威指南》的学习笔记03 -- 第五章.分隔线,图像,多媒体
- PHP学习笔记--第五章.数据库交互
- 《Linux命令行与shell脚本编程大全》 第五章 学习笔记