Google glog gflag快速入门

glog和gflag是工程中常常用到的两个google的开源库,在这里一起介绍一下一些基本的用法。

1. Google glog

参考:官方文档

glog全称是Google Logging Library,是google的开源日志系统,它轻巧灵活且功能完善,实现了程序级别的日志管理。
Google glog定义了一系列宏来简化日志工作。你可以:

  • 按严重级别记录日志
  • 通过命令行管理日志行为
  • 基于条件记录日志
  • 当预期条件没有达到时终止程序
  • 引入自定义日志级别
#include <glog/logging.h>

int main(int argc, char* argv[]) {
    // Initialize Google's logging library.
    google::InitGoogleLogging(argv[0]);

    // ...
    LOG(INFO) << "Found " << num_cookies << " cookies";
}

1.1. 严重级别(Severity Level)

Glog所支持的日志级别包括:INFOWARNINGERRORFATAL。当记录一个FATAL级别的日志后,程序会自动终止。要注意的是,给定级别的信息不仅会记录在该级别的日志里,也会记录在更低级别的日志里。
FATAL级别的日志仅在debug模式下(没有定义NDEBUG宏时)才会记录FATAL错误,在生产过程中,则会自动降级为ERROR以避免程序自动终止。
除非另外声明,glog会默认将日志记录在/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>路径下,例如 /tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474。默认情况下,glog也会另外将ERRORFATAL级别的信息输出至标准错误。

1.2. 设置标签(Flags)

如果电脑上也安装了Google gflags library,那configure脚本也会自动检测并使用它,这将允许你通过命令行传输标签。例如:

./your_application --logtostderr=1

如果没安装gflags,则可以通过环境变量设置标签,比如:

GLOG_logtostderr=1 ./your_application

在程序里面,则可以通过修改全局变量FLAGS_*来修改标签,比如:

LOG(INFO) << "file";
// Most flags work immediately after updating values.
FLAGS_logtostderr = 1;
LOG(INFO) << "stderr";
FLAGS_logtostderr = 0;
// This won't change the log destination. If you want to set this // value, you should do this before google::InitGoogleLogging .
FLAGS_log_dir = "/some/log/directory";
LOG(INFO) << "the same file";

常见的标签有:

  • logtostderrbool):输出至标准错误。
  • stderrthresholdint,默认为2):复制级别大于设定值的的日志至标准错误。
  • minloglevelint,默认为0)
  • log_dirstring):日志文件输出的路径。

1.3. 按条件记录

  • 按判断条件筛选:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
  • 每隔多少输出一个:
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
  • 输出前N个:
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";

1.4. CHECK宏

在程序中,定期检查结果是否符合预期是及早发现错误的好方式。CHECK宏提供了中断程序的方式,类似于assert
CHECK会在条件为假时终止程序,不同于assert,其不会受到NDEBUG选项影响。
举例:

CHECK(fp->Write(x) == 4) << "Write failed!";
CHECK_NE(1, 2) << ": The world must be ending!";
CHECK_NOTNULL(some_ptr);

1.5. Verbose Logging

VLOG宏允许你自定义不同级别的日志并通过--v选项管理。

VLOG(1) << "I'm printed when you run the program with --v=1 or higher";
VLOG(2) << "I'm printed when you run the program with --v=2 or higher";

此外--vmodule选项可以控制不同模块的日志情况:

--vmodule=mapreduce=2,file=1,gfs*=3 --v=0

将会:

  1. Print VLOG(2) and lower messages from mapreduce.{h,cc}
  2. Print VLOG(1) and lower messages from file.{h,cc}
  3. Print VLOG(3) and lower messages from files prefixed with "gfs"
  4. Print VLOG(0) and lower messages from elsewhere
    此外还有VLOG_IS_ON(n)宏、VLOG_IFVLOG_EVERY_NVLOG_IF_EVERY_N等。

1.6. 错误信息处理

可以使用google::InstallFailureSignalHandler()来启用,错误信息举例:

*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date ***
*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
PC: @           0x412eb1 TestWaitingLogSink::send()
    @     0x7f892fb417d0 (unknown)
    @           0x412eb1 TestWaitingLogSink::send()
    @     0x7f89304f7f06 google::LogMessage::SendToLog()
    @     0x7f89304f35af google::LogMessage::Flush()
    @     0x7f89304f3739 google::LogMessage::~LogMessage()
    @           0x408cf4 TestLogSinkWaitTillSent()
    @           0x4115de main
    @     0x7f892f7ef1c4 (unknown)
    @           0x4046f9 (unknown)

2. Google gflag

参考:官方文档

gflags是google使用的一个开源库,用于解析命令行标记。

2.1. 下载安装

git clone https://github.com/gflags/gflags.git

2.2. 定义Flags

示例:

#include <gflags/gflags.h>

DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
DEFINE_string(languages, "english,french,german",
              "comma-separated list of languages to offer in the 'lang' menu");

支持的flags类型:DEFINE_boolDEFINE_int32DEFINE_int64DEFINE_uint64DEFINE_doubleDEFINE_string
这些宏需要三个参数:标记的名字、默认值、说明。说明可以通过--help选项显示。
Flag只要定义一次,可以在头文件中声明(例如DECLARE_bool(big_menu)),这样其他的源文件可以通过include这个头文件来使用同样的flag。
注意大多数函数定义在google命名空间中。

2.3. 使用Flags

所有定义的flags都可以在程序中像正常的变量一样使用,只要添加前缀FLAGS_
例如:

if (FLAGS_consider_made_up_languages)
  FLAGS_languages += ",klingon";   // implied by --consider_made_up_languages
if (FLAGS_languages.find("finnish") != string::npos)
  HandleFinnish();

2.4. 解析命令行中的Flags

通常在main()中使用:

gflags::ParseCommandLineFlags(&argc, &argv, true);

其中最后一个参数决定是否从argv中移除flags,并修改argc
这样,可以在程序调用的时候控制flags:

./app_containing_foo --nobig_menu -languages="chinese,japanese,korean" ...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353