首先是日志等级:
Muduo中Logger是全局日志控制器,其调用过程如下
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) //命名格式