Ubantu下glog编译安装与使用简介
glog是google的开源日志系统,相比log4系列的日志系统,它更加轻巧灵活,而且功能也比较完善。
安装
glog使用gflags来解析参数,为此需要先安装gflags。
gflags安装
从git clone https://github.com/gflags/gflags
下载后,编译安装。进入gflags源码目录:
mkdir build
cd build/
cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON -DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/ ..
make
sudo make install
因已设定安装目录为/usr(会自动安装到/usr/lib目录下);为使gflags目录生效,只需sudo ldconfig
即可。
glog安装
从git clone https://github.com/google/glog
下载后,编译安装。进入glog源码目录:
./autogen.sh
./configure --prefix=/opt/glog
make
sudo make install
为使glog库生效,需要在/etc/ld.so.conf.d
下新建配置文件并使其生效:
vim glog.conf
// 输入 /opt/glog/lib
sudo ldconfig
使用
在使用前需要先初始化,在用完后需要清理,一般:
google::InitGoogleLogging(argv[0]); // 设定日志文件名,一般与程序同名
// 各功能代码...
LOG(INFO) << "info test" ; //输出一个Info日志
LOG(WARNING) << "warning test"; //输出一个Warning日志
LOG(ERROR) << "error test"; //输出一个Error日志
// ...
google::ShutdownGoogleLogging();
参数设定
通过参数,可以控制日志记录行为。日志默认记录在/tmp下,可通过log_dir设定:
FLAGS_log_dir="./log";
// 除直接使用FLAGS变量设定外,可通过在~/.bashrc中灵活配置
// export GLOG_log_dir="./log"
其他常用的参数(alsologtostderr在调试时非常方便)
FLAGS_logtostderr = false; //设置日志消息是否转到标准输出而不是日志文件)
FLAGS_log_prefix = true; //设置日志前缀是否应该添加到每行输出
FLAGS_logbufsecs = 0; //设置可以缓冲日志的最大秒数,0指实时输出
FLAGS_max_log_size = 10; //设置最大日志文件大小(以MB为单位)
FLAGS_stop_logging_if_full_disk = true; //设置是否在磁盘已满时避免日志记录到磁盘
#if NDEBUG
std::cout<<"Build-RELASE"<<std::endl;
FLAGS_alsologtostderr = false;
#else
std::cout << "Build-DEBUG" << std::endl;
FLAGS_alsologtostderr = true; //设置日志消息除日志文件之外同时输出到标准输出
FLAGS_colorlogtostderr = true; //设置记录到标准输出的颜色消息(如果终端支持)
#endif
条件输出
除基本的日志输出外,glog还支持条件输出:
LOG_IF(INFO, get_count > 10) << "Get too many times"; //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got " << google::COUNTER << "times"; // google::COUNTER记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_FIRST_N(INFO, 10) << "Got " << google::COUNTER << " times"; //当此语句执行的前 10 次都输出日志,然后不再输出
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << " too big"; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果是则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息
perror风格日志
glog提供了与LOG*和CHECK宏作用等价的PLOG()、PLOG_IF() 和PCHECK()宏,不同的是,后者在记录日志信息的时候,会将errno的状态及其描述附加到日志描述中。
PCHECK(write(fp, NULL, 4) == 4) << "Write NULL failed";
// 当条件不成立时,会输出日志信息:
// F0825 ...] Check failed: write(fp, NULL, 4) == 4 Write NULL failed: Bad address [14]
PLOG需要在函数调用后立即调用,要保证中间没有对errno产生影响。
Debug输出
glog提供特定的只在debug模式下生效的宏。以下分别对应LOG、LOG_IF、DLOG_EVERY_N操作的专用宏。
DLOG(INFO) << "Debug info";
DLOG_IF(INFO, get_count > 10) << "Get too many times";
DLOG_EVERY_N(INFO, 10) << "Got " << google::COUNTER << "times";
CHECK条件终止程序
glog提供了CHECK宏,用于在调试出错的时候中止程序,及早发现程序错误。当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的日志信息。功能类似于ASSERT,区别是CHECK宏不受NDEBUG约束,在release版中同样有效。具体使用如下:
- 判定大小关系
CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT
使用这些宏需要注意类型一致,如果出现类型不一致的,可使用static_cast转换 - 判定指针是否为空
CHECK_NOTNULL(some_ptr)
- 判定字符串是否相等
CHECK_STREQ, CHECK_STRNE
大小写敏感字符串来判定CHECK_STRCASEEQ, CHECK_STRCASENE
大小写不敏感字符串判定 - 判定浮点是否相等或相近
CHECK_DOUBLE_EQ,CHECK_NEAR
这两个宏都需要指定一个可容忍的偏差上限。
当这些宏判定条件不成立时,glog会生成一个FATAL级别的日志信息,该信息包含比较的两个值和stream方式传入的字符串,然后中止程序。
CHECK(write(fp, ary, 4) == 4) << "Write failed!"; // 出错时输出日志中包含 “write(fp, ary, 4) == 4” 和 “Write failed!”
CHECK_EQ(string("abc")[1], 'b');
CHECK_EQ(some_ptr, static_cast<SomeType*>(NULL));
异常处理
glog提供了比较方便的程序异常处理机制。例如,当程序出现SIGSEGV异常信号时,glog的默认异常处理过程会导出非常有用的异常信息。异常处理过程可以通过google::InstallFailureSignalHandler()来自定义。
void FailureWriter(const char *data, int size) {
LOG(ERROR) << data;
}
google::InstallFailureSignalHandler();
google::InstallFailureWriter(&FailureWriter);
上一篇: glog简介