基于muduo的rpc项目之异步日志模块

1.前言

muduo也提供了一个日志模块,功能很强大,但是是同步日志,同步日志会增加RPC方法的时间,性能不好。所以,需要一个异步日志模块。这里实现的相对简单,朋友们可以参考一下kafka(日志信息中间件模块是异步的)

2.设计思路

框架日志写入到队列里面,不需要关心日志什么时候落盘。这样RPC方法时间就不需要加入了磁盘io的时间。我们现在需要去设计这样一个队列完成相应的日志存储,让其他线程进行落盘。

3.队列设计

队列是基于c++提供的 std::queue,这是一个模板类,内部重改写了pop和push方法,其实就是生产者和消费者模型,push就是生产者,pop就是消费者,线程安全是利用条件变量和互斥锁共同维护的,保证队列是线程安全的,同时,日志模块也是一个单例模块。

4.日志文件设计

日志文件名按照 年+月+日去创建文件,(可以考虑文件大小)

5.宏定义

宏定义用do-while语句来做的,本质上就是创建临时日志对象,去写日志。

// 定义宏 LOG_INFO("xxx %d %s", 20, "xxxx")
#define LOG_INFO(logmsgformat, ...) \
    do \
    {  \
        Logger &logger = Logger::GetInstance(); \
        logger.SetLogLevel(INFO); \
        char c[1024] = {0}; \
        snprintf(c, 1024, logmsgformat, ##__VA_ARGS__); \
        logger.Log(c); \
    } while(0) \

#define LOG_ERR(logmsgformat, ...) \
    do \
    {  \
        Logger &logger = Logger::GetInstance(); \
        logger.SetLogLevel(ERROR); \
        char c[1024] = {0}; \
        snprintf(c, 1024, logmsgformat, ##__VA_ARGS__); \
        logger.Log(c); \
    } while(0) \
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值