工作流程
首先使用宏定义写日志
#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::Logger::DEBUG) \ muduo::Logger(__FILE__, __LINE__, muduo::Logger::DEBUG, __func__).stream() #define LOG_INFO if (muduo::Logger::logLevel() <= muduo::Logger::INFO) \ muduo::Logger(__FILE__, __LINE__).stream() #define LOG_WARN muduo::Logger(__FILE__, __LINE__, muduo::Logger::WARN).stream() #define LOG_ERROR muduo::Logger(__FILE__, __LINE__, muduo::Logger::ERROR).stream() #define LOG_FATAL muduo::Logger(__FILE__, __LINE__, muduo::Logger::FATAL).stream() #define LOG_SYSERR muduo::Logger(__FILE__, __LINE__, false).stream() #define LOG_SYSFATAL muduo::Logger(__FILE__, __LINE__, true).stream()
举例来说,当我们使用 LOG_INFO << "info…" 时,
相当于用__FILE__
(文件的完整路径和文件名)与 LINE(当前行号的整数 )初始化了一个Logger类,
出错时间、线程、文件、行号初始化号,接着将"info..."输入到缓冲区,在Logger生命周期结束时调用析构函数输出错误信息。
if (muduo::Logger::logLevel() <= muduo::Logger::TRACE)
这代表我们使用该LOG_INFO宏时会先进行判断,如果级别大于INFO级别,后面那句不会被执行,也就是不会打印INFO级别的信息。
整个调用过程:Logger --> impl --> LogStream --> operator<< FilxedBuffer --> g_output --> g_flush
日志级别
TRACE
指出比DEBUG粒度更细的一些信息事件(开发过程中使用)
DEBUG
指出细粒度信息事件对调试应用程序是非常有帮助的。(开发过程中使用)
INFO
表明消息在粗粒度级别上突出强调应用程序的运行过程。
WARN
系统能正常运行,但可能会出现潜在错误的情形。
ERROR
指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL
指出每个严重的错误事件将会导致应用程序的退出。
Logger.h
#ifndef MUDUO_BASE_LOGGING_H #define MUDUO_BASE_LOGGING_H #include "LogStream.h" #include "Timestamp.h" namespace muduo{ class TimeZone; class Logger{ public: /* 级别类型 muduo使用枚举的方式指出了输出错误信息的形式。 其中TRACE,DEBUG用于调试,INFO,WARN,ERROR,FATAL在程序运行过程中输出,警告的程度依次上升, 出现FATAL时程序将强制退出。NUM_LOG_LEVELS是这个枚举结构体中错误形式的数目,为6。 */ enum LogLevel{ TRACE, DEBUG, INFO, WARN, ERROR,