Linux服务器开发,开源框架log4cpp和日志模块实现
Linux服务器开发,开源框架log4cpp和日志模块实现
前言
fwrite到用户缓冲区再write再到内核,相比write直接写入内核肯定是多了一个缓冲区。需要特别注意的是,每次写入数据短<1024时候,fwrite效率更高。每次写的数据多,比如2900,write的效率更高,因为fwrite需要二次拷贝。
一、日志写入逻辑
log4cpp既拥有c语言风格printf()的日志输出格式,也有c++语言cout<<这种输出格式。
- 可以分模块打印不同的日志文件。
- 也可以把所有模块的日志也打印同一个文件。
一秒钟打印10000条日志,那肯定是不行的,会影响服务器性能。好的日志,一秒钟能达到百万级别。
同步日志方式,只适合用在客户端。
异步日志方式,适合在服务器。
检查文件大小,导致日志库性能大幅度下降。二、Log4cpp日志框架
实时写入磁盘 单笔write
多行日记累计再写入,累计了就差一行却一直得不到消息。
单独启动一个定时器,1秒去刷新一次。
三、log4cpp范例讲解
四、muduo日志库分析
1、性能分析
双缓冲机制
- 日志notify问题,写满一个buffer才一次notify
- 通过wait_timeout去读取日志,然后写入磁盘
2、日志批量写入
3、批量唤醒写线程
4.写日志用notify+wait_timeout方式触发日志的写入
5、锁的粒度,双缓冲,双队列
双缓冲机制:
1、日志notify问题
(1)写满一个buffer才一次notify插入日志,日志apt调用线程
(2)通过notifywait_timeout去读取日志,然后写入磁盘 日志落盘线程
2、能够避免buffer不断分配
3、buffer默认4M一个
那就写满4M才notify一次
6、buffer默认4M缓冲区,buffer队列,push、pop时使用mov语义减少内存拷贝
通过源码不难看出,当落盘线程跟不上生产日志线程会new一个新的缓冲队列。
把buffer里面的buffer转移道buffersToWrite 把里面的数据全部落盘。
总结
今天通过Darren老师的讲述,让我对日志库有了初步的了解。因为自己工作中正好需要日志库,所以利用业余时间调研了glog,booslog,log4cpp等等,听了darren老师的课如获至宝。以前认为日志库一秒钟写几千条就已经很了不起了,而Darren老师表示日志一秒钟记个几百万条才是正常的日志库,让我瞬间认清了自己与大佬之前的差距。希望未来能虚心学习,不断磨练意志,早日若离苦海。
推荐一个 c/c++Linux后台服务器开发的经典教程给大家,个人觉得讲的不错,有兴趣的可以学习下。
最新文章
- 大连软件行业概况
- Oracle中rowid的用法(全面)
- 俞敏洪一分钟励志演讲
- cocosbuilder创建工程
- python中的platform模块获取平台信息
- 程序员的情感修养 —— 专访“非诚勿扰”牵手成功男嘉宾程序员石川
- 简略写dump文件
- 朴素贝叶斯、贝叶斯网络分类器
- HTK语音识别工具包的安装和编译
- 倾听:不只是听见
- SOA教程之:SOA的优点和缺点
- 软件构造复习小结(2)——设计规约(Specification)
- 2021计算机考试准考证打印入口(附官网网址)
- 曼哈顿距离,欧式距离,明式距离,切比雪夫距离区别
- PHP视频教程 全35讲rmvb格式下载
- 微信小程序用定时器实现倒计时效果
- YOLOv3算法
- JavaScript弹出框、对话框、提示框、弹窗总结
- 推理题
- Qt QSqlQueryModel实现查询数据库内容