每一个成熟的项目都有大大小小的日志系统,在关键的地方打印日志信息,常用来跟踪程序运行,查找错误原因等,可以节省大量的debug
时间
muduo的日志信息有5个级别
- TRACE,细粒度最高的日志信息,打印的最详细
- DEBUG,细粒度级别上对调试有帮助的日志信息
- INFO,粗粒度级别上强调程序的运行信息
- WARN,程序能正常运行,但存在潜在风险的信息
- ERROR,执行出错,但不影响程序继续执行的错误信息
- FATAL,将导致程序退出的严重信息
muduo的日志格式为
在muduo的很多源文件中,多存在着输出日志信息的语句,例如
LOG_TRACE << "TimerQueue::handleRead() " << howmany << " at " << now.toString();
LOG_DEBUG << "EventLoop created " << this << " in thread " << threadId_;
LOG_INFO << "TcpServer::newConnection [" << name_
<< "] - new connection [" << connName
<< "] from " << peerAddr.toIpPort();
LOG_WARN << "fd = " << fd_ << " Channel::handle_event() POLLHUP";
LOG_ERROR << "TimerQueue::handleRead() reads " << n << " bytes instead of 8";
LOG_FATAL << "Another EventLoop " << t_loopInThisThread
<< " exists in this thread " << threadId_;
这些形如LOG_*
的调用实际上是宏定义
/*
* __FILE__:返回所在文件名
* __LINE__:返回所在行数
* __func__:返回所在函数名
*
* 这些都是无名对象,当使用LOG_* << "***"时,
* 1.构造Logger类型的临时对象,返回LogStream类型变量
* 2.调用LogStream重载的operator<<操作符,将数据写入到LogStream的Buffer中
* 3.当前语句结束,Logger临时对象析构,调用Logger析构函数,将LogStream中的数据输出
*/
#define LOG_TRACE if (muduo::Logger::logLevel() <= muduo::Logger::TRACE) \
muduo::Logger(__FILE__, __LINE__, muduo::Logger::TRACE, __func__).stream()
#define LOG_DEBUG if (muduo::Logger::logLevel() <= muduo