使用 Google 的 glog 日志库

如何安装

  glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API。在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数(可以参见 gflags 安装教程)。下面是 glog 的安装步骤:

1
2
3
4
5
6
$ git clone https://github.com/google/glog.git
$ cd glog
$ mkdir build
$ cmake ..
$ make
$ sudo make install

  安装之后要怎么使用 glog 呢?如果程序是使用 CMake 构建的,那么只要在 CMakeListsx.txt 里面加上下面几行配置就可以了:

1
2
3
4
find_package (glog 0.3.5 REQUIRED)
add_executable (main main.cpp)
target_link_libraries (main glog::glog)

日志级别

  glog 支持四种日志级别,INFOWARNINGERRORFATAL。默认情况下,在打印完FATAL日志之后,程序将会终止。ERRORFATAL的日志除了会写到日志中,还会输出到 stderr。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <gflags/gflags.h>
#include <glog/logging.h>
int main(int argc, char* argv[])
{
// 解析命令行参数
gflags::ParseCommandLineFlags(&argc, &argv, true);
// 初始化日志库
google::InitGoogleLogging(argv[0]);
LOG(ERROR) << "Hello, World!";
}

日志配置

  默认情况下,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()不同的是,无论程序是否开启NODEBUGCHECK()都会执行。除了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(),它的第三个参数为用户指定的误差范围。

参考资料