Google/glog

来源:互联网 发布:手机exe解压软件 编辑:程序博客网 时间:2024/06/11 16:19

glog简介:

google 出的一个C++轻量级日志库,支持以下功能:

◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
◆ 严重性分级,根据日志严重性分级记录日志;
◆ 可有条件地记录日志信息;
◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
◆ 异常信号处理。程序异常情况,可自定义异常处理过程;
◆ 支持debug功能;
◆ 自定义日志信息;
◆ 线程安全日志记录方式;
◆ 系统级日志记录;
◆ google perror风格日志信息;
◆ 精简日志字符串信息

安装:
https://github.com/google/glog

 

使用:

linux:
./configure --preifx=mypath
make
make install

写个编译该cpp文件的shell脚本,如下(这里使用静态链接方式):

#! /bin/sh

LIB_DIR='mypath/glog/lib/libglog.a'
INCLUDE_DIR='mypath/glog/include/'
g++ -g test.cpp $LIB_DIR -I$INCLUDE_DIR -lpthread -o test
./test

# 以上脚本有两点值得注意:
1、要加-lpthread 
2、要保证test.cpp放在ligglog.a路径的前面

 

windows:

使用vs打开glog.sln直接编译。
将glog/src 和 使用的库放进代码中。

加入signalhandler.cc到libglog的源文件中。否则无法追堆栈信息。


文档:

在doc里面

 

使用说明以及DEMO:

 

//定义日志文件输出目录
FLAGS_log_dir = "c:\\GLogFiles"; 
//调用这一句会产生日志文件
google::InitGoogleLogging("abc.exe");
//与上一句成对使用
google::ShutdownGoogleLogging();

 

//线程安全日志记录
glog提供了线程安全的日志记录方式。
在<glog/raw_logging.h>文件中提供了相关的宏,
如,RAW_CHECK,RAW_LOG等。
这些宏的功能与CHECK,LOG等一致,


//日志分级

日志信息严重性等级按由低到高排列依次为:
enum SeverityLevel
{
  google::INFO = 0,
  google::WARNING = 1,
  google::ERROR = 2,
  google::FATAL = 3,
};

 

//运行参数
FLAGS_stderrthreshold=google::INFO;
FLAGS_colorlogtostderr=true;

 

//DEBUG模式支持
DEBUG模式日志输出形式,增加前缀D表示DEBUG模式日志,如DLOG(log_severity),DLOG_IF(log_severity,condition)
采用DEBUG宏控制,非DEBUG模式中DEBUG日志不会编译进程序就避免了程序冗余

 

//条件输出
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";   //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";  //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie";  //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果滞则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息。
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";  //当此语句执行的前 20 次都输出日志,然后不再输出

条件宏:
LOG_IF(condition)
计数宏:
LOG_EVERY_N(log_severity,num)
LOG_IF_EVERY_N(log_severity,condition,num)
LOG_FIRST_N(log_severity,num)
使用google::COUNTER计数
验证宏:
功能类似assert断言,但不受DEBUG模式控制即非DEBUG模式也生效
如果验证失败,会写FATAL日志并终止程序运行
CHECK(condition)
比较验证:
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
其中CHECK_NOTNULL不能作为日志输出流使用
比较验证中,在输出中会输出比较值,所以要求比较值重载了输出操作符(operator<<(ostream,...))
在验证宏中,参数会是匿名参数如CHECK(string("abc")[1],'b')

 

//CHECK宏
当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的日志信息。功能类似于ASSERT,区别是 CHECK 宏不受 NDEBUG 约束,在 release 版中同样有效。
CHECK(port == 80)<<"HTTP port 80 is not exit.";

 

//core dumped 
通过 google::InstallFailureSignalHandler(); 即可注册


//自定义输出方式:
//将信息输出到单独的文件和 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;
}
google::InstallFailureWriter(&SignalHandle);

 

//常用配置

google::SetLogDestination(google::ERROR,"log/prefix_"); //第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀。
google::SetStderrLogging(google::INFO);   //输出到标准输出的时候大于 INFO 级别的都输出;等同于 FLAGS_stderrthreshold=google::INFO;
FLAGS_logbufsecs =0;   //实时输出日志
FLAGS_max_log_size =100;   //最大日志大小(MB)
#define GOOGLE_STRIP_LOG 3 // 小于此级别的日志语句将在编译时清除,以减小编译后的文件大小,必须放在 #include 前面才有效。


//简单封装

//
// create by mqd at 2017 01 18
//

#include "glog/logging.h"
#include "glog/raw_logging.h"
#include <string>

class GLogHelper
{
public:

explicit GLogHelper(const char* program, const char* dir);
~GLogHelper();
private:

static void SignalHandle(const char* data, int size){
std::string str = std::string(data, size);
LOG(ERROR) << str;
}
};

GLogHelper::GLogHelper(const char* program, const char* dir){

#ifdef _WIN32
system("md log");
#else
system("mkdir log");
#endif // _WIN32

std::string tempdir = dir;
google::InitGoogleLogging(program);

FLAGS_colorlogtostderr = true;
google::SetStderrLogging(google::INFO);
google::SetLogDestination(google::INFO, (tempdir + std::string("/INFO_")).c_str()); 
google::SetLogDestination(google::WARNING, (tempdir + std::string("/WARNING_")).c_str());
google::SetLogDestination(google::ERROR, (tempdir + std::string("/ERROR_")).c_str());

FLAGS_logbufsecs = 0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size = 100; //最大日志大小为 100MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出

#ifndef _WIN32
google::InstallFailureSignalHandler(); //捕捉 core dumped
google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,
#endif // !_WIN32

}
//GLOG内存清理:
GLogHelper::~GLogHelper(){
google::FlushLogFiles(google::INFO);
//关闭日志库 也会删除日志文件
//google::ShutdownGoogleLogging();
}

int main() {
GLogHelper("lalal","log");
LOG(WARNING) << "我在InitInstance()";
LOG(INFO) << "Found " << 1 << " cookies";
}

本文参考:http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html 
0 0
原创粉丝点击