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) \