GLOG Note

本文记录 Glog 的笔记

简介

Google Glog是Google的一个开源库,用于实现应用级别的logging。 它提供了一系列类似于C++流风格的(注意在后面代码中留意)logging API,以及一些预定义的宏。它有点类似于C里面的assert,但是比它具备更丰富的输出信息以及使用灵活性。

具体来说,GLOG 支持以下功能:

  • 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为; 严重性分级,根据日志严重性分级记录日志;
  • 可有条件地记录日志信息;
  • 条件中止程序。丰富的条件判定宏,可预设程序终止条件; 异常信号处理。程序异常情况,可自定义异常处理过程;
  • 支持debug功能; - 自定义日志信息;
  • 线程安全日志记录方式;
  • 系统级日志记录;
  • google perror风格日志信息;
  • 精简日志字符串信息

example

 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
30
31
32
33
34
35
36
37
38
//  Usage: g++ glogtest.cpp -o glogtest -lglog
//  reference: * https://blog.csdn.net/Solomon1558/article/details/52558503
//             * https://zhuanlan.zhihu.com/p/26025722

#include <iostream>
#include <string>
#include <glog/logging.h>

int main(int argc, char** argv) {
    FLAGS_alsologtostderr = 1;
    google::InitGoogleLogging(argv[0]);

    //通过SetLogDestination可能没有设置log_dir标志位的方式方便(会遗漏一些日志)
    //google::SetLogDestination(google::GLOG_INFO, "/tmp/today");

    //标志位
    FLAGS_colorlogtostderr=true;  //设置输出颜色
    FLAGS_v = std::atoi(argv[1]); //设置最大显示等级(超过该等级将不记录log)
    FLAGS_log_dir = "./logs";

    LOG(INFO) << "Found " << google::COUNTER << " arguments!";

    // assert
    CHECK(access(argv[2], 0) != -1) << "No such file: "<<argv[2];

    LOG(INFO) << "I am INFO!";
    LOG(WARNING) << "I am WARNING!";
    LOG(ERROR) << "I am ERROR!";

    //VLOG用来自定义日志, 可以在括号内指定log级别
    VLOG(1) << "[Custom log(VLOG)] Level 1!";
    VLOG(2) << "[Custom log(VLOG)] Level 2!";
    VLOG(3) << "[Custom log(VLOG)] Level 3!";
    VLOG(4) << "[Custom log(VLOG)] Level 4! This is used for detailed message which need not to be printed each time.";
    VLOG(5) << "[Custom log(VLOG)] Level 5! On this level messages are print as detail as possible for debugging.";
    LOG(FATAL) << "I am FATAL!";
    return 0;
}
  • LOG:内置日志,可以看做一个ostream,向屏幕输出的同时可以重定向到其他位
  • INFO / WARNING / ERROR / FATAL:代表了不同的log级别。其中FATAL的出现会直接导致程序中断。ERROR不会中断程序,但是对应的LOG会显示为红色;WARNING对应LOG会显示为黄色。
  • VLOG:自定义日志,括号中的数字越大则对应log级别越高。只有log级别小于FLAGS_v标志位的,在代码运行阶段才会被打印出来。
  • COUNTER:用来统计某个代码被执行了多少次。
  • CHECK宏:类似于Assert

Conditional/Occasional logging

1
2
3
4
5
6
7
8
9
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";

LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER
                                           << "th big cookie";

LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";

Debug Mode

1
2
3
4
5
DLOG(INFO) << "Found cookies";

DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";

默认是打开了 debug 模式。 取消 debug 模式, g++/gcc 参数选项中使用 -DNDEBUG == #define NDEBUG

Check Macros

It is a good practice to check expected conditions in your program frequently to detect errors as early as possible. The CHECK macro provides the ability to abort the application when a condition is not met, similar to the assert macro defined in the standard C library.

1
2
3
4
5
6
7
8
9
CHECK(fp->Write(x) == 4) << "Write failed!";

// macros for equality/inequality checks - CHECK_EQ,
// CHECK_NE, CHECK_LE, macros for equality/inequality checks - CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, and CHECK_GT.CHECK_LT, CHECK_GE, and CHECK_GT.
CHECK_NE(1, 2) << ": The world must be ending!";
CHECK_EQ(string("abc")[1], 'b');

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

日志配置

默认情况下,glog 会将日志输出到 /tmp 目录下,日志文件命名格式为:

<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

可以通过命令行 flag log_dir指定日志目录,例如:

./main --log_dir=.    # 将日志输出到当前目录

glog 还支持其它的命令行 flag:

  • logtostderr将日志输出到 stderr,不输出到日志文件,默认值是 false。
  • minloglevel如果程序输出的日志的级别大于或等于这个值,那么日志就会被记录下来,它的默认值是 0,代表INFO (1 代表WARNING,2 代表ERROR,而 3 代表FATAL)。

Reference

  1. glog
updatedupdated2022-02-162022-02-16