google-glog:开源c++轻量级日志库
2015-02-18 13:33
489 查看
glog简介
Google glog is a library that implements application-level logging. This library provides logging APIs based on C++-style streams and various helper macro.参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
严重性分级,根据日志严重性分级记录日志;
可有条件地记录日志信息;
条件中止程序。丰富的条件判定宏,可预设程序终止条件;
异常信号处理。程序异常情况,可自定义异常处理过程;
支持debug功能;
自定义日志信息;
线程安全日志记录方式;
系统级日志记录;
google perror风格日志信息;
精简日志字符串信息
安装 和 使用
下载地址:
https://code.google.com/p/google-glog/downloads/list解压安装:
tar zxvf glog-0.3.3.tar.gz && cd glog-0.3.3 && ./configure && make
头文件目录为 /src/glog ,链接库为 .libs/libglog.{a,so}
帮助文档为 doc/glog.html 或直接访问以下 URL: http://google-glog.googlecode.com/svn/trunk/doc/glog.html
简单Demo
#include <glog/logging.h> int main(int argc,char* argv[]) { LOG(INFO) << "Hello,GLOG!"; }
只需要include logging.h头文件 链接时,需要 -lglog -lpthread
主要内容
日志
日志等级
enum SeverityLevel { google::INFO = 0, google::WARNING = 1, google::ERROR = 2, google::FATAL = 3, };
在输出FATAL日志消息后,会终止程序运行
DEBUG模式中,DFATAL级别对应ERROR–便于调试,而非DEBUG模式则对应FATAL
日志文件
每个级别都对应有相应的日志文件,日志文件的位置及名称定义如下:windows下是”C:\Users\user_name\AppData\Local\Temp”
Linux是”/tmp”
文件名称:
programname.hostname.user_name.log.severity_level.date.time.pid
Linux还会创建为每个文件创建一个文件链接
如果日志输出超过 FLAGS_max_log_size 设置的大小,则会分为多个文件存储,链接文件就会指向其中最新的对应级别的日志文件。所以当日志文件较多时,查看链接文件来查看最新日志挺方便的。
输出规则:
- 每个级别的日志除了输出到对应日志文件中,还输出到每个低级别日志文件中
- 如一个ERROR日志,会输出到INFO,WARNING,ERROR三个日志文件中
- 默认,ERROR和FATAL消息除了输出到日志文件中之外,还会输出到标准错误中
符号变量
通过符号变量可以定制日志行为
在程序中,通过修改全局变量(使用前缀”FLAGS_”)来设置符号变量- 大多数符号变量修改后会立即生效
- 与输出位置有关(如FLAGS_log_dir),如果要生效需要在google::InitGoogleLogging()之前设置
列举符号变量
(可参见源码src/glog/logging.h line:321-361):logtostderr(bool,default=false),只输出到STDERR而不写入日志文件
stderrthreshold(int,default=ERROR),高于该级别的日志除写入日志文件还输出到STDERR
minloglevel(int,default=INFO),低于该级别的日志消息不输出
colorlogtostderr(bool, default=false),将输出到 stderr 上的错误日志显示相应的颜色
log_dir(string,default=”“),日志输出目录
v(int,default=0),小于等于该值的VLOG(m)会被输出,否则不会输出
vmodule(string,default=”“),可为源文件定制VLOG日志输出级别
max_log_size(int,default=1800),日志文件最大值(单位MB)
log_link(string,default=”“),日志文件的连接所在的文件夹
stop_logging_if_full_disk(bool,default=false),如果磁盘写满是否停止记录日志
alsologtoemail(string,default=”“),是否将日志额外发送邮件到指定地址
logemaillevel(int,default=999),设置发送邮件的日志等级
logmailer(string,default=”/bin/mail”),发送邮件程序
APIs
void google::InitGoogleLogging(const char* argv0)初始化glog库,参数是第一个命令行参数即程序名
void google::ShutdownGoogleLogging()
关闭glog库
void google::FlushLogFiles(LoSeverity min_severity)
[Thread-safe]指定级别以上的所有日志消息都立即写入到日志文件
void google::FlushLogFilesUnsafe(LogSeverity min_severity)
非线程安全的输出指定级别以上的日志消息,用于灾难性程序问题时输出必要的日志消息
void google::SetLogDestination(LogSeverity severity,const char*
base_filename)
[Thread-safe]设置指定级别的日志输出的日志文件,如果base_filename为”“则表示该级别日志不输出
void google::SetLogSymlink(LogSeverity severity,const char*
symlink_basename)
[Thread-safe]设置置顶级别的日志文件的软连接,symlik_basename为空表示不设置软连接。如果不调用该函数,系统默认连接名称是程序名
void google::AddLogSink(LogSink *destination)
void google::RemoveLogSink(LogSink *destination)
Thread-safe]添加和删除日志输出渠道
void google::SetLogFilenameExtension(const char* filename_extension)
[Thread-safe]为所有日志文件添加文件扩展名,特别用于SetLogDestination()设置的日志文件
通常做法是将监听的端口号作为日志文件扩展名
void google::SetStderrLogging(LogSeverity
min_severity)
[Thread-safe]确定除了输出到日志文件同时还输出到STDERR的日志最小级别
void google::LogToStderr()
[Thread-safe]设置只只将日志输出到STDERR而不输出到日志文件
void google::SetEmailLogging(LogSeverity min_severity,const char* address)
[Thread-safe]设置发送邮件的日志最小级别
bool google::SendEmail(const char dest,const char subject,const char *body)
[Thread-safe]发送邮件
const std::vector& google::GetLoggingDirectories()
获取日志输出目录集合
void google::InstallFailureSignalHandler()
信号处理函数,处理的主要信号有SIGSEGV/SIGILL/SIGFPE/SIGBRT/SIGBUS/SIGTERM
void google::InstallFailureWriter(void (writer)(const char data,int size))
4000
设置系统崩溃时的输出函数,data数据不一定是以’\0’结尾
void google::InstallFailureFunction(void (*fail_func)())
设置LOG(FATAL)在输出日志消息后调用的函数
处理core dumped
通过 google::InstallFailureSignalHandler()注册,默认捕捉 SIGSEGV 信号信息输出会输出到 stderr;通过 google::InstallFailureFunction(void (*func)())定制错误处理
通过 google::InstallFailureWriter(void (writer)(const char data,int size)) 自定义输出方式,例如:
#include <glog/logging.h> #include <string> #include <fstream> //将信息输出到单独的文件和 LOG(ERROR) void SignalHandle(const char* data, int size) { std::ofstream fs("glog_dump.log",std::ios::app); std::string str = std::string(data,size); fs<<str; fs.close(); LOG(ERROR)<<str; } class GLogHelper { public: GLogHelper(char* program) { google::InitGoogleLogging(program); FLAGS_colorlogtostderr=true; google::InstallFailureSignalHandler(); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式: google::InstallFailureWriter(&SignalHandle); } ~GLogHelper() { google::ShutdownGoogleLogging(); } }; void fun() { int* pi = new int; delete pi; pi = 0; int j = *pi; } int main(int argc,char* argv[]) { GLogHelper gh(argv[0]); fun(); }
条件宏
LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;上面的语句表示,只有当num_cookies > 10条件成立时,“Got lots of cookies”日志信息才被记录。
LOG_EVERY_N(INFO, 10) << “Got the ” << COUNTER << “th cookie”;
上面的语句表示,在程序中周期性的记录日志信息,在该语句第1、11、21……次被执行的时候,记录日志信息。COUNTER变量表示该语句被执行的次数。
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << “Got the ” << COUNTER<<”th big cookie”;
上面的语句为前两项功能的合并,size>1024的条件连续成立10次的时候记录日志信息。COUNTER变量表示该条件成立的次数。
LOG_FIRST_N(INFO, 20) << “Got the ” << COUNTER << “th cookie”;
上面的语句表示,当该语句只在首次执行了20次以后记录日志信息, COUNTER变量表示该语句被执行的次数。
条件宏中,如果为假则右边日志中的函数不会执行
CHECK 宏
当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的FATAL日志信息。功能类似于ASSERT,区别是 CHECK 宏不受 NDEBUG 约束,在 release 版中同样有效。CHECK(condition)
参数会是匿名参数如CHECK(string(“abc”)[1],’b’)
比较验证:
在输出中会输出比较值,所以要求比较值重载了输出操作符(operator<<(ostream,…))
CHECK_EQ(arg1,arg2)
CHECK_NE(arg1,arg2)
CHECK_LE(arg1,arg2)
CHECK_LT(arg1,arg2)
CHECK_GE(arg1,arg2)
CHECK_GT(arg1,arg2)
CHECK_NOTNULL(arg)
不能作为日志输出流使用
字符串比较:
CHECK_STREQ
CHECK_STRNE
CHECK_STRCASEEQ
CHECK_STRCASENE
浮点数验证:
CHECK_DOUBLE_EQ
CHECK_NEAR
TODO
定制日志(Verbose Logging)debug功能
……
参考:
google-glog 开源库分析
glog
google-glog功能介绍
相关文章推荐
- 开源项目之C++日志框架 Google Glog
- 开源项目之C++日志框架 Google Glog
- 优秀开源项目之五:C++日志框架 Google Glog
- C++的开源跨平台日志库glog学习研究(三)--杂项
- google glog开源日志库经典文档
- C++日志操作开源函数库之Google-glog
- C++的开源跨平台日志库glog学习研究(一)
- 【神经网络与深度学习】【C/C++】C++日志操作开源函数库之Google-glog
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
- 玩转Google开源C++单元测试框架Google Test系列
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
- 玩转Google开源C++单元测试框架Google Test系列(gtest)
- 玩转Google开源C++单元测试框架Google Test系列(gtest)
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
- (转)玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
- (转)玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest