muduo/base/Logging.h --Logger类的声明和LOG_INFO等宏定义
muduo/base/Logging.cc --Logger构造、析构等方法的实现
muduo/base/LogStream.h --FixedBuffer类和LogStream类
muduo/base/LogStream.cc --LogStream重载<<运算符
在muduo中日志分了以下这几种级别,默认级别为INFO,TRACE和DEBUG的日志不输出。
日志级别 | 表示 |
---|---|
TRACE | 指出比DEBUG粒度更细的信息事件 |
DEBUG | 指出细粒度事件,用于开发调试 |
INFO | 表明消息在粗粒度级别上突出强调应用程序的运行过程 |
WARN | 系统能正常运行,但可能会出现潜在错误 |
ERROR | 虽然发生错误事件,但不影响系统的继续运行 |
FATAL | 指出每个严重的错误事件将会导致应用程序的退出 |
明白了muduo的日志级别就可以使用日志了,使用muduo的日志十分简单
#include <muduo/base/Logging.h>
#include <errno.h>
using namespace muduo;
int main()
{
LOG_TRACE<<"trace ...";
LOG_DEBUG<<"debug ...";
LOG_INFO<<"info ...";
LOG_WARN<<"warn ...";
LOG_ERROR<<"error ...";
//LOG_FATAL<<"fatal ...";
errno = 13;
LOG_SYSERR<<"syserr ...";
LOG_SYSFATAL<<"sysfatal ...";
return 0;
}
默认是输出到stdout,当然也可以输出到自定义文件
#include <muduo/base/Logging.h>
#include <errno.h>
#include <stdio.h>
using namespace muduo;
FILE* g_file;
void dummyOutput(const char* msg, int len)
{
if (g_file)
{
fwrite(msg, 1, len, g_file);
}
}
void dummyFlush()
{
fflush(g_file);
}
int main()
{
g_file = ::fopen("/tmp/muduo_log", "ae");
Logger::setOutput(dummyOutput);
Logger::setFlush(dummyFlush);
LOG_TRACE<<"trace ...";
LOG_DEBUG<<"debug ...";
LOG_INFO<<"info ...";
LOG_WARN<<"warn ...";
LOG_ERROR<<"error ...";
//LOG_FATAL<<"fatal ...";
errno = 13;
LOG_SYSERR<<"syserr ...";
//LOG_SYSFATAL<<"sysfatal ...";
::fclose(g_file);
return 0;
}
所以调用 LOG_INFO<<" " 时发生了什么呢?
简单的说:LOG_INFO是宏定义,生成Logger类的临时对象,调用stream()方法返回其中的流对象stream,流对象stream重载了<<运算符,先将日志保存到其中的缓冲区FixedBuffer,当Logger临时对象销毁时,在析构函数中将缓冲区的输出到stdout或设置的文件。
下面按照这个流程看一下主要代码
原文:https://www.cnblogs.com/Lj-ming/p/14763650.html