Google Glog是一个C++语言的应用级日志记录框架,提供了C++风格的流操作和各种助手宏。
头文件:
#include <glog/logging.h>
设置日志文件保存目录,这个目录必须是已经存在的:
FLAGS_log_dir = "c:\\Logs";
使用glog之前需要先初始化库,在生成日志文件之前,即开始log之前:
google::InitGoogleLogging(argv[0]); //括号内是程序名
在结束glog时,必须要关闭库,否则会内存溢出:
google::ShutdownGoogleLogging();
glog的四个错误级别:
enum SeverityLevel
{
google::INFO = 0,
google::WARNING = 1,
google::ERROR = 2,
google::FATAL = 3,
};
输出日志:
LOG(INFO) << "info test"; //输出一个Info日志
LOG(WARNING) << "warning test"; //输出一个Warning日志
LOG(ERROR) << "error test"; //输出一个Error日志
LOG(FATAL) << "fatal test"; //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序
条件输出:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTEER << "th cookie"; //google::COUNTEER 记录该语句被执行的次数,从1开始,在第一次运行输出日志之后,每隔10次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTERE << "th big cookie";//上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果是则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie"; //当此语句执行的前 20 次都输出日志,然后不再输出
几个函数:
google::SetLogDestination(google::GLOG_INFO, "log/prefix_"); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
google::SetLogFilenameExtension("logExtension"); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出
有条件地终止程序— Check 宏
glog提供CHEECK宏,用于在调试时终止程序,以及早发现程序的错误。当通过该宏指定的条件不成立的时候,程序会终止,并记录对应的日志信息。功能类似于ASSERT,区别是CHECK宏不受NDEBUG约束,在releasee版中也有效。若条件成立,则输出NULL,即不记录任何信息。
使用如下:
CHECK(fp->Write(x) == 4) << "Write failed!";
当条件不成立的时候,记录“Write failed!”日志信息,并终止程序。
Glog提供了多个宏来处理特定关系的判定:
- 判断大小关系:
CHECK_EQ,CHECK_NE,CHECK_LE,CHECK_LT,CHECK_GE,CHECK_GT
。使用这些宏需要注意类型的一致。 - 判定指针是否为空:
CHECK_NOTNULL(some_ptr)
- 判断字符串是否相等:
CHECK_STREQ, CHECK_STRNE, CHECK_STRCASEEQ, CHECK_STRCASENE。
这两组是在判断时是否大小写敏感。 - 判断浮点数是否相等或相近:
CHECK_DOUBLE_EQ,CHECK_NEAR
。这两个宏都需要制定一个可容忍的偏差上限。
*这里给出CHECK_的定义
#define CHECK_EQ(x,y) CHECK_OP(x,y,EQ,==)
#define CHECK_NE(x,y) CHECK_OP(x,y,NE,!=)
#define CHECK_LE(x,y) CHECK_OP(x,y,LE,<=)
#define CHECK_LT(x,y) CHECK_OP(x,y,LT,<)
#define CHECK_GE(x,y) CHECK_OP(x,y,GE,>=)
#define CHECK_GT(x,y) CHECK_OP(x,y,GT,>)
至于CHECK_OP()
就是另外的宏定义了。
CHECK宏就是不满足条件的时候,输出信息,并终止程序。