gflag以及glog安装
Gflags安装与使用
如何安装
gflags 是一个 C++ 库,用于解析命令行参数。下面是安装步骤:
1 | git clone https://github.com/gflags/gflags.git |
NOTICE:如果是为了装后面的glog
遇到libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `.rodata.str1.1' ca时
1 | glfag编译成动态库gflags 正确的安装方法是这样的: |
CMakeListsx.txt 配置:
1 | find_package (gflags REQUIRED) |
使用介绍
定义命令行 flag:
1 |
|
这行代码定义了一个命令行 flag,名字是 port,它的类型是gflags::int32,默认值是8080。除了int32之外,gflags 还支持bool、int64、uint64、double和string类型。 定义好一个 flag 之后,还可以给它加上一个校验函数,验证 flag 的取值是否合法:
1 |
|
上面的代码会验证port的取值范围,如果取值不合法,则会报错:
1 | $ ./main --port=5800 --debug |
参考资料
https://gflags.github.io/gflags/
Glog安装与使用
如何安装
glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API。在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数。下面是 glog 的安装步骤:
1 | git clone https://github.com/google/glog.git |
CMakeLists.txt 配置:
1 | find_package (glog 0.3.5 REQUIRED) |
日志级别
glog 支持四种日志级别,INFO、WARNING、ERROR和FATAL。默认情况下,在打印完FATAL日志之后,程序将会终止。ERROR和FATAL的日志除了会写到日志中,还会输出到 stderr。
1 |
|
日志输出配置
默认情况下,glog 会将日志输出到 /tmp 目录下,日志文件命名格式为:
1 | <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid> |
通过命令行 flag log_dir指定日志目录:
1 | ./main --log_dir=. # 将日志输出到当前目录 |
glog 还支持其它的命令行 flag:
- logtostderr将日志输出到 stderr,不输出到日志文件,默认值是 false。
- minloglevel如果程序输出的日志的级别大于或等于这个值,那么日志就会被记录下来,它的默认值是 0,代表INFO (1 代表WARNING,2 代表ERROR,而 3 代表FATAL)。
调试模式
一种常见的调试手段就是使用 debug 日志,在调试模式下 (也即没有开启NDEBUG),可以使用DLOG()来输出 debug 日志,例如:
1 | DLOG(INFO) << "Hello, World!"; |
检查程序错误
glog 提供了CHECK()宏帮助我们检查程序的错误,当CHECK()的条件不满足时,它会记录FATAL日志并终止程序:
1 | CHECK(fun() == 0) << "Call fun() failed!"; |
与assert()不同的是,无论程序是否开启NODEBUG,CHECK()都会执行。除了CHECK(),glog 还提供其它的宏,包括CHECK_EQ()、CHECK_NE()、CHECK_LE()、CHECK_LT()、CHECK_GE()和CHECK_GT()。 在判断指针是否为NULL时,需要注意先将NULL转换成为相应的类型,然后再进行比较:
1 | CHECK_EQ(some_ptr, static_cast<SomeType*>(NULL)) << "some_ptr is a null pointer"; |
glog 还提供了其它宏用来检查char *类型的字符串,包括CHECK_STREQ()、CHECK_STRNE()、CHECK_STRCASEEQ()和CHECK_STRCASENE(),带有 CASE 的版本表示大小写不敏感的。传递NULL值给这些宏是安全的。 另外,可以使用CHECK_DOUBLE_EQ()检查两个浮点数是否相等,允许出现比较小的误差。如果需要自己提供可以接受的误差范围,可以使用CHECK_NEAR(),它的第三个参数为用户指定的误差范围。
参考资料
http://rpg.ifi.uzh.ch/docs/glog.html