muduo库分析——base篇(9)日志

首先是日志等级:

muduo库分析——base篇(9)日志_第1张图片


Muduo中Logger是全局日志控制器,其调用过程如下

muduo库分析——base篇(9)日志_第2张图片

Logger封装了impl资源类,Implement里面有stream对象,重载了<<符号,调用时将其Buffer资源进行数据整合,Logger析构时,获得stream中的buffer中的data数据,将数据填充到g_output函数中进行回调。

logging.h 和logging.c

 class SourceFile	//系统放入资源文件地址时进行解析提取文件名称
LogStream& stream() { return impl_.stream_; }	//impl技术,impl指针指向资源类

  static LogLevel logLevel();	//全局日志等级
  static void setLogLevel(LogLevel level);

  typedef void (*OutputFunc)(const char* msg, int len);	//输出函数,一般设置为控制台输出函数或者日志储存硬盘函数
class Impl	//日志的基本数据
{
 public:
  typedef Logger::LogLevel LogLevel;
  Impl(LogLevel level, int old_errno, const SourceFile& file, int line);
  void formatTime();
  void finish();

  Timestamp time_;	//时间戳
  LogStream stream_;	//日志流
  LogLevel level_;	
  int line_;
  SourceFile basename_;	//名称
};
//宏定义使用LOG_INFO << "Good news";返回stream,重载了<<,写入日志数据
#define LOG_TRACE if (muduo::Logger::logLevel() <= muduo::Logger::TRACE) \
  muduo::Logger(__FILE__, __LINE__, muduo::Logger::TRACE, __func__).stream()
Logger::LogLevel initLogLevel()	//默认的日志等级
void defaultOutput(const char* msg, int len)//默认输出函数
{
  size_t n = fwrite(msg, 1, len, stdout);//输出到标准输出
  //FIXME check n
  (void)n;
}

LogStream.h 和LogStream.cpp

class FixedBuffer : boost::noncopyable
	//缓冲区数据的读写
void append(const char* /*restrict*/ buf, size_t len)		//数据粘合
  const char* data() const { return data_; }	//返回当前缓冲区指针
  char* current() { return cur_; } //返回已写入数据的指针
  Buffer buffer_;	//Stream拥有一块buffer用于数据储存
					//Logger创建时使用stream <<读取数据,数据放在buffer中
					//Logger销毁时获得buffer中data指针,同时执行logger输出函数使用data数据
template
size_t convert(char buf[], T value)		//数字转换为字符串

LogFile.h 和 LogFile.cpp

LogFile用于计算文件名称,满足一定次数后写新的文件或者文件大小满了后写新的文件

  boost::scoped_ptr mutex_;
  time_t startOfPeriod_;	//开始时间
  time_t lastRoll_;		//上一次更换文件时间
  time_t lastFlush_;	//上一次flush时间
  boost::scoped_ptr file_;	//文件指针

  const static int kRollPerSeconds_ = 60*60*24;
void LogFile::append_unlocked(const char* logline, int len)	//控制file_写入数据,如果无法写入则换新的文件写入
bool LogFile::rollFile()	//开启一个新的文件储存日志
string LogFile::getLogFileName(const string& basename, time_t* now)	//命名格式







你可能感兴趣的:(c++)