创作人QQ:851301776,邮箱:lfr890207@163.com
欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!
个人座右铭:
1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习。
很多工作招聘写着:C/C++, 之前一直很不理解。每个人都有自己最擅长的语言,C或者C++,很多人都说C和C++是一样的,只要代码量达到一定的程度,很容易理解C++的代码。确实是能理解,但是不代表你能写出来。所以学习了一下log4cpp和mudo日志库,这两个日志库本身都是使用C++实现的,本质和我们C语言一样,都是fwrite和write来写。但是有时候造轮子,就是需要学习他们的思想,成为自己的东西。
二、日志库的核心 1.日志库设计性能关键点
(1)批量写入和每条写入性能区别:批量写入效率要高很多
(2)批量写入和每条写入实时性的区别:效率和实时性成反比
2.日志库的常见功能(1)支持日志级别,不通的日志库级别有差异,本质定义消息写入的先后顺序
(2)日志格式化:根据自己的需求定义每条日志的内容
(3)日志输出:输出到本地文件、输出到控制台类似于(printf)、通过网络输出到远程服务器(5G基站有些是把日志直接输出到公司服务器的)
(4)日志回滚:本地日志支持的最大文件限制、当本地文件到达最大文件限制的时候新建一个文件、每天新建一个文件。
(5)配置文件:这个是作为库的话使用居多,自己写的话,一般都不用或者简单的配置文件即可。
三、fwrite和write的区别写日志的时候这两个函数是我们的选择的,但是两个有什么区别那个效率高?
1.write本质也是调用的fwrite。
2.fwrite内部有一定的缓存
综合:fwrite效率更高,首选
四、日志库比较 1.log4xx
Apache的产品,属于apache的子项目之一,由log4j移植过来的,移植过来的东西多数都有一个特点,那就是依赖各种库。log4xx就需要依赖apr-utils,编译麻烦
2. log4cpp感觉上log4cpp和log4cplus大同小异,支持的功能也类似。它是由log4j移植过来的
3.log4cpluslog4cplus比log4cpp支持的功能更加全面,支持线程安全,但是也很繁琐,相对比较好。
4.glog全称:google glog。比log4系列的都简单,不支持配置文件形式的,我个人觉得比较好
5.zlog使用C语言编写,支持windows和Linux,但是Linux不好用,所以慎重选择
6.muduo是C++ stream风格,用起来比较自然,异步日志库,建议首选
五、个人总结心得 写日志流程:用户组织数据-》fwrite写入内核缓存--》落盘
主要分为三个阶段:
(1)第一个阶段用户组织数据
核心点在:用户组织完成后,把数据放到一个队列中
(2)写数据到内核缓存
核心点:
1.单独启动一个线程。
2.从队列中定时或者使用阻塞接收信号的方式的拿取数据,封装成要写入的数据。
3.批量写入,一次写若干条,写入若干个文件
(4)落盘
核心点:写线程用notify+wait_timout的方式刷盘
六、日志库核心问题 (1)如何提高日志库的性能?1.文件批量写入
2.批量唤醒写线程
3.写线程使用notify_wite_timeout的方式刷盘
4.锁的力度
(2)程序崩溃,日志没及时写入,能否找回?参考:muduo异步日志——core dump查找未落盘的日志 · 语雀



