Google glog库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏。
代码示例:
#include
int main(int argc,_TCHAR* argv[])
{
google::InitGoogleLogging((const char *)argv[0]);
google::SetLogDestination(google::GLOG_INFO, "./myInfo");
LOG(WARNING) << "thisis the 1st warning!";
return 0;
}
“LOG”宏为日志输出关键字,“INFO”为严重性程度。
主要支持功能如下:
参数设置。以命令行启动参数的方式设置标志参数来控制日志记录行为;
严重性分级。根据日志严重性分级记录日志;
可有条件地记录日志信息;
条件中止程序。丰富的条件判定宏,可预设程序终止条件;
异常信号处理。程序异常情况,可自定义异常处理过程;
支持debug功能。可只用于debug模式;
自定义等级日志信息;
原始日志记录。无需加锁与动态分配内存的轻量级线程安全版本;
系统日志记录;
google perror风格日志信息;
日志信息移除。
glog的使用是比较简单的,几乎可以不用配置就直接使用了。在配置方式上,glog和一般的日志系统(如log4系列)是不太一样的,后者一般使用配置文件, 而glog是在命令行参数中指定的。对比优缺点,配置文件做的配置可能更加强大一些, 不过命令行配置虽然简单但是也不失灵活。
glog支持四种日志级别,INFO、WARNING、ERROR、FATAL。不同级别的日志信息会输出到不同文件,同时高级别的日志也会写入到低级别中。默认情况下,在打印完FATAL日志之后,程序将会终止。ERROR和FATAL的日志除了会写到日志中,还会输出到 stderr。
enum SeverityLevel
{
google::INFO = 0,
google::WARNING = 1,
google::ERROR = 2,
google::FATAL = 3,
};
LOG_IF(INFO,num_cookies > 10) << "Gotlots of cookies"; //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Gotthe " << google::COUNTER<< "thcookie"; //google::COUNTER记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Gotthe " << google::COUNTER<< "th bigcookie"; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果滞则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息。
LOG_FIRST_N(INFO, 20) << "Gotthe " << google::COUNTER<< "thcookie"; //当此语句执行的前 20 次都输出日志,然后不再输出
演示代码如下:
#include
int main(int argc,char* argv[])
{
google::InitGoogleLogging(argv[0]);
FLAGS_stderrthreshold=google::INFO;
FLAGS_colorlogtostderr=true;
for(int i = 1; i <= 100;i++)
{
LOG_IF(INFO,i==100)<<"LOG_IF(INFO,i==100) google::COUNTER="<<google::COUNTER<<" i="<<i;
LOG_EVERY_N(INFO,10)<<"LOG_EVERY_N(INFO,10) google::COUNTER="<<google::COUNTER<<" i="<<i;
LOG_IF_EVERY_N(WARNING,(i>50),10)<<"LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER="<<google::COUNTER<<" i="<<i;
LOG_FIRST_N(ERROR,5)<<"LOG_FIRST_N(INFO,5) google::COUNTER="<<google::COUNTER<<" i="<<i;
}
google::ShutdownGoogleLogging();
}
1.下载:
https://github.com/google/glog
2.解压安装:
tar -zxvf glog-0.3.3.tar && cd glog-0.3.3 && ./configure && make && make install
以下代码为实现将log信息存储在/log/HostRunLog目录下,首先应该设置各个输出等级的的log文件的存储路径及prefix,然后设置实时输出日志文件(实时刷新),最后设置一个log文件的最大存储大小,注意:程序的执行用户应当有/log/HostRunLog目录的操作权限,否则可能导致日志存储失败。
#include
// 初始化google log库
void log_init()
{
// glog参考链接:https://blog.csdn.net/yao_hou/article/details/125044275
// FLAGS_log_dir = "/log/HostRunLog"; //设置日志文件保存目录,必须在初始化库之前调用。
if (!google::IsGoogleLoggingInitialized()) //若是GoogleLog库没有被初始化,则调用下面函数InitGoogleLogging进行log库初始化
google::InitGoogleLogging("HOST"); //!< Init libglog with program name
google::SetLogDestination(google::INFO, "/log/HostRunLog/LOG_INFO_"); //设置INFO目录:/log/TCU_INFO_
google::SetLogDestination(google::WARNING, "/log/HostRunLog/LOG_WARNING_"); //设置WARNING目录:/log/TCU_WARNING_
google::SetLogDestination(google::ERROR, "/log/HostRunLog/LOG_ERROR_"); //设置ERROR目录:/log/TCU_ERROR_
google::SetStderrLogging(google::INFO); //!< Log also out to stderr
google::InstallFailureSignalHandler(); //!< Capture SIGSEGV info and out to stderr
google::SetLogFilenameExtension(".log"); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
FLAGS_logbufsecs = 0; //设置实时输出日志,实时刷新(必须设置为0)
FLAGS_max_log_size = 1024; //max_log_size:1024MB 设置日志记录文件最大大小,MB为单位,默认值为1800,当前超过当前大小,则保存剩余数据至文件,并创建新的文件保存其他日志信息;
}
int main(int argc, char** argv)
{
log_init(); //首先初始化log库,并设置各种log信息存储的前缀信息
LOG(INFO) << "test11111111111..."; //LOG(INFO):日志等级宏,记录日志信息;“LOG”宏为日志输出关键字,“INFO”为严重性程度(包括INFO WARNING ERROR)
LOG(WARNING) << "test222222222222...";
LOG(ERROR) << "test3333333333333...\n";
return 0;
}
g++ glogtest.cpp -lglog -std=c++17
./a.out
执行结束,可以看到在/log/HostRunLog目录下生成了多个log文件,如下图所示: