Linux服务器开发,开源框架log4cpp和日志模块实现

时间: 2023-08-22 admin IT培训

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后台服务器开发的经典教程给大家,个人觉得讲的不错,有兴趣的可以学习下。