C++谷歌开源项目glog学习笔记

Posted 鱼酱2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++谷歌开源项目glog学习笔记相关的知识,希望对你有一定的参考价值。

1.下载地址

https://github.com/google/glog

2.qt creater +cmake

安装qt creater ,勾选minggw

3.vs2019 +cmake

安装vs2019 勾选cmake ,c++开发相关

4.勾选共享库

5.使用说明

5.1介绍

Google glog 是一个实现应用程序级 日志记录的库.
该库提供基于C ++样式的流和各种帮助程序宏的日志记录API
您可以通过简单地将内容流式传输到 LOG(),
e.g.

   #include <glog / logging.h>

   int main(int argc,char * argv [])
     //初始化Google的日志记录库。
     google :: InitGoogleLogging(argv [0]);
     // ...
     LOG(INFO)<<“ Found” << num_cookies <<“ cookies”;
   

5.2等级

您可以指定以下的严重性级别(严重程度的增加顺序): ,INFO,WARNING, ERROR和FATAL,记录FATAL消息将终止程序(在记录消息之后).请注意,给定严重性的消息不仅会记录在该严重性的日志文件中,还会记录在所有严重性较低的日志文件中。例如,严重程度的信息FATAL将被记录到严重程度的日志文件FATAL,ERROR, WARNING,和INFO里

5.3标志

几个标志会影响glog的输出行为。如果您的计算机上安装了Google gflags库,则该 configure脚本(有关此脚本的详细信息,请参阅软件包中的INSTALL文件)将自动检测并使用它,从而允许您在命令行中传递标志。例如,如果要打开该标志–logtostderr,则可以使用以下命令行启动应用程序:

 ./your_application --logtostderr = 1

如果未安装Google gflags库,则可以通过环境变量设置标志,并在标志名称前添加“ GLOG_”,例如

  GLOG_logtostderr=1 ./your_application

以下标志是最常用的:

logtostderr(bool,默认= false)
将消息记录到stderr而不是日志文件中。
注意:您可以设置二进制标志,以true指定 1,true或yes(不区分大小写)。此外,您还可以设置二进制标志,以false指定 0,false或no(再次,不区分大小写)。

stderrthreshold(int,默认= 2,即ERROR)
除了日志文件之外,还将此级别或更高级别的日志消息复制到stderr。严重性级别的数量 INFO,WARNING,ERROR,和 FATAL分别是0,1,2,和3。

minloglevel(int,默认= 0,即INFO)
记录此级别或更高级别的消息。再次,严重性级别的数量INFO,WARNING, ERROR,和FATAL分别是0,1,2,和3。

log_dir(string,default =“”)
如果指定,日志文件将写入此目录,而不是默认的日志目录。

v(int,默认值= 0)
显示所有小于或等于此标志值的VLOG(m)消息m。可被–vmodule覆盖。有关更多详细信息,请参见有关详细日志记录的部分。

vmodule(string,default =“”)
每个模块的详细级别。该参数必须包含<模块名称> = <日志级别>的逗号分隔列表。<模块名称>是全局模式(例如,gfs*对于名称以“ gfs”开头的所有模块),与文件名基础(即,名称忽略.cc / .h ./- inl.h)匹配。覆盖–v给定的任何值。另请参见有关详细日志记录的部分。

在logging.cc中定义了其他一些标志。请grep“ DEFINE_”的源代码以查看所有标志的完整列表。
您还可以通过修改全局变量来修改程序中的标志值FLAGS_。更新后,大多数设置将立即开始工作FLAGS_。例外是与目标文件有关的标志。例如,您可能想FLAGS_log_dir在调用之前进行设置google::InitGoogleLogging。这是一个例子:

 LOG(INFO)<<“文件”;
   //大多数标志在更新值后立即起作用。
   FLAGS_logtostderr = 1;
   LOG(INFO)<<“ stderr”;
   FLAGS_logtostderr = 0;
   //这不会更改日志目标。如果要设定这个
   //值,您应该在google :: InitGoogleLogging之前执行此操作。
   FLAGS_log_dir =“ / some / log / directory”;
   LOG(INFO)<<“同一文件”;

5.4条件的使用

有时,您可能只想在某些条件下记录一条消息。您可以使用以下宏执行条件日志记录:

LOG_IF(INFO,num_cookies> 10)<<“有很多cookie”;

仅当变量num_cookies超过10 时,才会记录“大量Cookie”消息 。如果多次执行一行代码,则仅以特定间隔记录一条消息可能会很有用。这种日志记录对于信息性消息最有用。

LOG_EVERY_N(INFO,10)<<“得到了” << google :: COUNTER <<“ th cookie”;

上一行在执行的第1、11、21,…次输出日志消息。请注意,特殊 google::COUNTER值用于标识正在发生的重复。

您可以将条件和偶然日志记录与以下宏结合使用。

LOG_IF_EVERY_N(INFO,(size> 1024),10)<<“得到了” << google :: COUNTER
<<“大饼干”;

您可以将输出限制为前n次出现,而不是每隔n次输出一条消息:

LOG_FIRST_N(INFO,20)<<“得到了<< << google :: COUNTER <<” th cookie“;

输出前20次的日志消息。同样,google::COUNTER标识符指示发生了哪个重复。

5.5调试模式支持

特殊的“调试模式”日志记录宏仅在调试模式下有效,对于非调试模式的编译,宏将被编译为空。使用这些宏可避免由于过多的日志记录而减慢生产应用程序的速度。

   DLOG(INFO)<<“找到的cookie”;

   DLOG_IF(INFO,num_cookies> 10)<<“有很多cookie”;

   DLOG_EVERY_N(INFO,10)<<“得到了” << google :: COUNTER <<“ th cookie”;

5.6检查宏

最好经常检查程序中的预期条件,以尽早发现错误。的 CHECK宏提供中止应用程序时一个条件没有被满足,类似的能力assert在标准C库中定义的宏。

CHECK如果条件不成立,则中止应用程序。不同于assert,它不受的控制 NDEBUG,因此无论编译模式如何,都将执行检查。因此,fp->Write(x)在以下示例中始终执行:

   CHECK(fp-> Write(x)== 4)<<“写入失败!”;

有平等/不平等检查各种辅助宏- ,CHECK_EQ, CHECK_NE,CHECK_LE,CHECK_LT, CHECK_GE和CHECK_GT。他们比较两个值,并FATAL在结果不符合预期时记录包含两个值的 消息。值必须已operator<<(ostream, …)定义。

您可以这样添加到错误消息中:

   CHECK_NE(1,2)<<“:世界一定要结束了!”;

我们非常小心,以确保每个参数都只被求值一次,并且在此处合法传递为函数参数的任何事物都是合法的。特别是,这些参数可能是临时表达式,最终将在明显的语句结尾处被销毁,例如:

   CHECK_EQ(string(“ abc”)[1],'b');

如果参数之一是指针而另一个参数为NULL,则编译器将报告错误。要解决此问题,只需将static_cast NULL更改为所需指针的类型即可。

   CHECK_EQ(some_ptr,static_cast <SomeType *>(NULL));

更好的是,使用CHECK_NOTNULL宏:

   CHECK_NOTNULL(some_ptr);
   some_ptr-> DoSomething();

由于此宏返回给定的指针,因此在构造函数初始化列表中非常有用。

   struct S 
     S(Something* ptr) : ptr_(CHECK_NOTNULL(ptr)) 
     Something* ptr_;
   ;

请注意,由于此功能,您不能将此宏用作C ++流。CHECK_EQ在中止应用程序之前,请使用上述方法记录自定义消息。

如果您比较C字符串(字符*),一组实用宏执行案件的敏感以及不区分大小写的比较- , CHECK_STREQ,CHECK_STRNE, CHECK_STRCASEEQ和CHECK_STRCASENE。CASE版本不区分大小写。您可以安全地NULL 为此宏传递指针。他们将NULL与任何非NULL字符串视为不相等。两个NULLs相等。

注意,两个参数都可以是临时字符串,它们在当前“完整表达式”的末尾处被破坏(例如,CHECK_STREQ(Foo().c_str(), Bar().c_str())where Foo和Barreturn C ++ std::string)。

的CHECK_DOUBLE_EQ两个浮点值的宏检查平等,接受一个小的误差裕度。 CHECK_NEAR接受第三个浮点参数,该参数指定可接受的误差范围。

以上是关于C++谷歌开源项目glog学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

关于c++的glog和spdlog的性能对比

如何通过编写编辑器来学习 C++? [关闭]

知识分享:值得学习的三大C++语言经典开源项目

谷歌日志库GLog 使用说明

GLOG使用Demo

google开源库glog源码实现分析