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-.tar.gz && cd glog- && ./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 = ,
google::WARNING = ,
google::ERROR = ,
google::FATAL = ,
};
在输出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))
设置系统崩溃时的输出函数,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 = ;
int j = *pi;
}
int main(int argc,char* argv[])
{
GLogHelper gh(argv[]);
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功能介绍