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学习笔记的主要内容,如果未能解决你的问题,请参考以下文章