muduo笔记 日志库(二)
目录
- 后端
- AsyncLogging类
- 数据成员
- LargeBuffer 存放大量log消息
- 后端线程 异步写数据到log文件
- LogFile类
- 构造函数
- 滚动日志文件
- 日志文件名
- 写日志文件操作
- flush日志文件
- AppendFile类
- 数据结构
- RAII方式打开、关闭文件
- 写数据到文件
- AsyncLogging类
- 使用异步日志
- 小结
- 参考
前半部分,中提到muduo异步日志库分为两部分:前端和后端。这部分描述后端。
后端
前端主要实现异步日志中的日志功能,为用户提供将日志内容转换为字符串,封装为一条完整的log消息存放到RAM中;
而实现异步,核心是通过专门的后端线程,与前端线程并发运行,将RAM中的大量日志消息写到磁盘上。
后端主要包括:AsyncLogging, LogFile, AppendFile,MutexLock。
AsyncLogging 提供后端线程,定时将log缓冲写到磁盘,维护缓冲及缓冲队列。
LogFile 提供日志文件滚动功能,写文件功能。
AppendFile 封装了OS提供的基础的写文件功能。
类图关系如下:
AsyncLogging类
AsyncLogging 主要职责:提供大缓冲Large Buffer(默认4MB)存放多条日志消息,缓冲队列BufferVector用于存放多个Large Buffer,为前端线程提供线程安全的写Large Buffer操作;提供专门的后端线程,用于定时或缓冲队列非空时,将缓冲队列中的Large Buffer通过LogFile提供的日志文件操作接口,逐个写到磁盘上。
数据成员
/**
* Provide async logging function. backend.
* Background thread (just only one) call this module to write log to file.
*/
class AsyncLogging : noncopyable
{
...
private:
typedef muduo::detail::FixedBuffer Buffer; // Large Buffer Type
typedef std::vector> BufferVector; // 已满缓冲队列类型
typedef BufferVector::value_type BufferPtr;
const int flushInterval_; // 冲刷缓冲数据到文件的超时时间, 默认3秒
std::atomic running_; // 后端线程loop是否运行标志
const string basename_; // 日志文件基本名称
const off_t rollSize_; // 日志文件滚动大小
muduo::Thread thread_; // 后端线程
muduo::CountDownLatch latch_; // 门阀, 同步调用线程与新建的后端线程
muduo::MutexLock mutex_; // 互斥锁, 功能相当于std::mutex
muduo::Condition cond_ GUARDED_BY(mutex_); // 条件变量, 与mutex_配合使用, 等待特定条件满足
BufferPtr currentBuffer_ GUARDED_BY(mutex_); // 当前缓冲
BufferPtr nextBuffer_ GUARDED_BY(mutex_); // 空闲缓冲
BufferVector buffers_ GUARDED_BY(mutex_); // 已满缓冲队列
}
AsyncLogging数据按功能主要分为3部分:1)维护存放log消息的大缓冲Large Buffer;2)后端线程;3)传递给其他类对象的参数,如basename_,rollSize_;
LargeBuffer 存放大量log消息
Large Buffer(FixedBufferhttps://blog.csdn.net/luotuo44/article/details/19252535
https://docs.microsoft.com/en-us/previous-versions/af6x78h6(v=vs.140)?redirectedfrom=MSDN