基于google glog库实现log信息存储

一、glog库介绍

1.1 简介

Google glog库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏。

代码示例:

#include <glog/logging.h>
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”为严重性程度。

主要支持功能如下:

  1. 参数设置。以命令行启动参数的方式设置标志参数来控制日志记录行为;

  2. 严重性分级。根据日志严重性分级记录日志;

  3. 有条件地记录日志信息;

  4. 条件中止程序。丰富的条件判定宏,可预设程序终止条件;

  5. 异常信号处理。程序异常情况,可自定义异常处理过程;

  6. 支持debug功能。可只用于debug模式;

  7. 自定义等级日志信息

  8. 原始日志记录。无需加锁与动态分配内存的轻量级线程安全版本;

  9. 系统日志记录

  10. google perror风格日志信息;

  11. 日志信息移除

glog的使用是比较简单的,几乎可以不用配置就直接使用了。在配置方式上,glog和一般的日志系统(如log4系列)是不太一样的,后者一般使用配置文件, 而glog是在命令行参数中指定的。对比优缺点,配置文件做的配置可能更加强大一些, 不过命令行配置虽然简单但是也不失灵活。

1.2 glog的日志级别

glog支持四种日志级别,INFO、WARNING、ERROR、FATAL。不同级别的日志信息会输出到不同文件,同时高级别的日志也会写入到低级别中。默认情况下,在打印完FATAL日志之后,程序将会终止。ERROR和FATAL的日志除了会写到日志中,还会输出到 stderr。

enum SeverityLevel
{
  google::INFO = 0,
  google::WARNING = 1,
  google::ERROR = 2,
  google::FATAL = 3,
};

1.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 <glog/logging.h>


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.4 glog库安装

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目录的操作权限,否则可能导致日志存储失败。

2.1 程序源码

#include <glog/logging.h>       

// 初始化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;
}

2.2 编译 & 执行

g++ glogtest.cpp -lglog -std=c++17
./a.out

2.3 执行结果

在这里插入图片描述
执行结束,可以看到在/log/HostRunLog目录下生成了多个log文件,如下图所示:
在这里插入图片描述


版权声明:本文为weixin_42700740原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。