muduo库分析——base篇(9)日志
程序员文章站
2022-06-14 10:21:50
...
首先是日志等级:
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) //命名格式