Apollo中的glog和gflag
本文是学习Apollo中基础工具的第三篇文章,主要是学习glog和gflag。
首先必须说百度Apollo却是对google的那一套情有独钟啊,前有protobuf,bazel,在有glog和glag。google全家桶啊。
glog的基础知识学习
glog是Google开源的轻量级日志系统。支持以下功能:
◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
◆ 严重性分级,根据日志严重性分级记录日志;
◆ 可有条件地记录日志信息;
◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
◆ 异常信号处理。程序异常情况,可自定义异常处理过程;
◆ 支持debug功能;
◆ 自定义日志信息;
◆ 线程安全日志记录方式;
◆ 系统级日志记录;
◆ google perror风格日志信息;
◆ 精简日志字符串信息
1.安装glog
$git clone https://github.com/google/glog
$./autogen.sh && ./configure && make && make install
gflags 库会默认安装在 /usr/local/lib/ 下,头文件放在 /usr/local/include/gflags/
.包含头文件
#include <glog/logging.h>
3.使用glog
#include <iostream>
#include <glog/logging.h>
int main(int argc, char* argv[]) {
google::InitGoogleLogging(argv[0]);
FLAGS_log_dir = "/tmp/logs/";
LOG(INFO) << "hello world";
return 0;
}
编译:g++ glogtest.cpp -o glogtest -lglog
4.glog相关设置
glog默认是输出到stderr,可以通过初始化参数或设置输出日志目录,修改输出到指定文件
初始化参数默认是输出到/tmp目录下,格式为 “…log…”
有有一些默认参数可以设置:
FLAGS_log_dir = “”; //设置日志文件输出目录
FLAGS_alsologtostderr = false; //日志记录到文件的同时输出到strerr
FLAGS_max_log_size = 1800; //最大日志大小(MB), 如果设置为0将默认为1
其他参数查找在glog/logging.h文件中
glog在apollo中的应用
首先在log.h头文件中包含了
#include <glog/logging.h>
而后在多个需要用glog的位置对glog进行了初始化:
google::InitGoogleLogging(argv[0]);
gflag的基础知识学习
直接先看一段示例代码:
#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");
int main(int argc, char **argv) {
google::ParseCommandLineFlags(&argc, &argv, true);
cout << "argc=" << argc << endl;
if (FLAGS_big_menu) {
cout << "big menu is ture" << endl;
} else {
cout << "big menu is flase" << endl;
}
cout << "languages=" << FLAGS_languages << endl;
return 0;
}
首先需要包含头文件。
然后通过类似于宏定义的方式,定义标志位。
gflags 暂时支持如下参数的类型:
DEFINE_bool: boolean
DEFINE_int32: 32-bit integer
DEFINE_int64: 64-bit integer
DEFINE_uint64: unsigned 64-bit integer
DEFINE_double: double
DEFINE_string: C++ string
gflag 提供的宏定义参数该宏的 3 个参数分别为命令行参数名,参数默认值,参数的帮助信息。
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_name 像正常变量一样访问标志参数。在这个程序中,通过 FLAGS_big_menu和FLAGS_languages访问它们。
整合一起,初始化所有参数
定义号参数后,最后要告诉执行程序去处理命令行传入的参数,使得 FLAGS_*参数们得到正确赋值。
通常就是再main()函数中调用;
google::ParseCommandLineFlags(&argc, &argv, true);