muduo笔记 日志库(二)


目录
  • 后端
    • AsyncLogging类
      • 数据成员
      • LargeBuffer 存放大量log消息
      • 后端线程 异步写数据到log文件
    • LogFile类
      • 构造函数
      • 滚动日志文件
      • 日志文件名
      • 写日志文件操作
      • flush日志文件
    • AppendFile类
      • 数据结构
      • RAII方式打开、关闭文件
      • 写数据到文件
  • 使用异步日志
  • 小结
  • 参考

前半部分,中提到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