高性能图像处理服务器的实现(一)高性能异步日志

      日志是调试一个服务器的最好方法了,在大型的服务器项目中,如果一直日志的输出总是有问题,或者输出的信息含糊不明,那么,你的调试过程将会非常痛苦,如果是普通的内存泄漏或者越界访问,或者TCP通信过程中的一些问题,那么通过errno也许还能帮你一下,但如果是跑了一段时间的服务器突然宕机,那么定位问题将会非常的困难。由此可见,一个高效安全且保证输出所有信息(我这里的保证输出所有信息表示即使服务器立即停止,日志系统也能把当下所有的信息输出到日志文件中)的日志系统,是一个服务器项目中不可或缺的一个环节,下面我将介绍在我的高性能图像处理服务器中的日志模块的一些编写思路和具体细节。

      我的日志系统框架是参照陈硕大大的muduo来进行编写的,总的框架思路为:     

      1.采用了双缓冲技术的buffer,具体思路为准备4个(如果短时间内数据写入量巨大,buffer数量会随情况增加,正常情况下为4个)buffer,其中两个buffer(这里称之A,B)作为前端输入,另外两个buffer(这里称之C,D)作为后端预备输入,当A,B写满或者达到写入时间间隔时,交换AB和CD,然后后端将A,B的信息写入日志文件,前端如有信息写入则写入到C,D中,如此循环往复。这样做的好处是前端把消息做了汇总,然后通知后端处理,避免频繁唤醒线程,降低开销。

      2.开启一个专门的线程作为一个异步日志的后端处理线程,该线程的主要任务为固定时间或者收到通知后交换写Buffer,然后将已写好数据的Buffer中的数据写入到文件中。这么做的好处是异步处理,其他线程阻塞的时候不会影响到日志信息的写入。

      3.编写Logger类,通过重载<<操作符,将信息写入Logger的buffer中,当Logger析构的时候通过调用注册在Logger中的output回调将信息写入异步日志的buffer中。这么做的好处是在应用程序中使用方便,并且可以方便的给日志等级做分级处理。

      基本消息处理框架如下:

然后再稍微消息说明下异步日志的具体工作流程:

1.首先在LogStream声明了几个宏定义,用来做日志消息等级分级,我的日志分4级:

 LOG_INFO(用于记录普通的信息,如有新的消息写入或者client接入等)

       LOG_TRACE(记录用于调试的信息,如EPOLL中的事件发生等)

 LOG_WARNING(记录可能产生错误但不会让程序立即崩溃的代码是否发生,如调用注册的回调事件时出现未定义的事件编号等)

 LOG_ERROR(记录错误信息,如记录errno等)

2.每一条消息写入日志前会给其添加头尾信息,如添加代码行数,发生时间等,这么做的好处是方便定位错位,我的日志消息标准格式如下:


 实际生成的日志如下:


       同理,当log文件过多时,log文件的命名也需要规范,我的log文件命名格式如下:

     main.cpp-time-2018.2.7.20.49.10.955452-pid-30075.log(1)

     有格式的日志消息在日志消息量巨大时可以起到很好的作用,你可以用awk工具轻松的提取你想要的信息。

3.一条日志消息的完整写入过程如下,以LOG_INFO为例


具体的代码见我的GitHub:https://github.com/zk3326312/ZK_ImageServer/tree/master/log,在log库中有一个testAsynLogging文件,可以用来测试日志库的写入性能和是否能成功写入,如果觉得可以的话帮我点个星吧,下一篇博文我将写一个reactors in threads的网络库编写方法。






 







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值