欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-14 10:21:50
...

首先是日志等级:

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


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

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

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<typename T>
size_t convert(char buf[], T value)		//数字转换为字符串

LogFile.h 和 LogFile.cpp

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

  boost::scoped_ptr<MutexLock> mutex_;
  time_t startOfPeriod_;	//开始时间
  time_t lastRoll_;		//上一次更换文件时间
  time_t lastFlush_;	//上一次flush时间
  boost::scoped_ptr<FileUtil::AppendFile> 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)	//命名格式