您的位置:首页 > 编程语言 > C语言/C++

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功能介绍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  google 开源 日志