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


    一、glog库介绍

    1.1 简介

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    “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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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 次都输出日志,然后不再输出
    
    • 1
    • 2
    • 3
    • 4

    演示代码如下:

    #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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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        
    
    // 初始化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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    2.2 编译 & 执行

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

    2.3 执行结果

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

  • 相关阅读:
    python+selenium实现UI自动化(入门篇)
    (一)文件系统-ext4特性
    Qt之遮罩—实现不规则窗体
    看服装数字化工厂是如何运作的
    状态机动态规划之股票问题总结
    室友看世界杯我在学redis事务
    【前端精进之路】JS篇:第11期 深拷贝与浅拷贝
    Python框架篇(1):FastApi-快速入门
    CAD二次开发--CAD2007(.Net3.5环境)等低版本CAD二次开发在VS中无法捕获断点调试解决办法(CAD二次开发无法断点调试解决办法)
    谷歌浏览器最新版和浏览器驱动下载地址
  • 原文地址:https://blog.csdn.net/weixin_42700740/article/details/126725916