欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ubantu下glog编译安装与使用简介

程序员文章站 2022-03-20 14:06:04
...

安装

使用

 

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版中同样有效。具体使用如下:

  1. 判定大小关系
    CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT
    使用这些宏需要注意类型一致,如果出现类型不一致的,可使用static_cast转换
  2. 判定指针是否为空
    CHECK_NOTNULL(some_ptr)
  3. 判定字符串是否相等
    CHECK_STREQ, CHECK_STRNE 大小写敏感字符串来判定
    CHECK_STRCASEEQ, CHECK_STRCASENE 大小写不敏感字符串判定
  4. 判定浮点是否相等或相近
    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);
相关标签: C++与VC C++ glog