您的位置:首页 > 编程语言 > Go语言

Google/glog

2017-01-19 10:59 253 查看


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