Google glog——一个基于程序级记录日志信息的c++库

参考博文 google-glog安装使用 Google-glog 日志库使用手记 Google glog 使用 glog功能介绍html

Google glog是Google开发的C++库,提供了C++风格的流操做与宏,实现程序日志记录。git

下载、安装及环境配置

  • Google glog目前托管在GitHub,目前最新的稳定版本为V0.35版,须要注意的是,直接用Git下载的话,会直接选master版本,V0.35版只可以直接下载ZIP文件。github

  • 下载完成后解压,运行根目录下的google-glog.sln,使用VS编译,注意选择Debug和Release,以及Win32和X64(这里选择X64,Debug)。 编译完成后,根目录下会生成一个名为X64的文件夹,其下有一个Debug文件夹,该文件夹下有glog的动态连接库libglog.dll,libglog.lib文件,静态连接库libglog_static.lib。windows

  • 在Qt下新建一个控制台程序Glog_Test,将glog根目录下的src/windows/glog文件夹(glog头文件目录)复制到Glog_Test的目录下,将动态连接库文件libglob.lib复制到glog文件夹内,将libglob.lib做为外部第三方动态连接库添加至Glog_Test,同时,将libglog.dll复制到Glog_Test的编译输出目录。缓存

  • 在main.cpp中包含glog的头文件 #include "glog/logging.h"cookie

Demo

#include <QCoreApplication>
#include "glog/logging.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    google::InitGoogleLogging(argv[0]);
    LOG(INFO) <<"GLOG INFO TEST!";
    google::ShutdownGoogleLogging();

    return a.exec();
}

输出为 I1019 17:23:06.249490 21820 QGlog.cpp:36] GLOG INFO TEST!函数

google::InitGoogleLogging(argv[0]);            //使用glog以前必须先初始化库,仅需执行一次,括号内为程序名
google::ShutdownGoogleLogging();            //当要结束glog时必须关闭库,不然会内存溢出

Glog严重性分级

Glog日志分为四个级别,枚举以下:测试

enum SeverityLevel
{
  google::INFO = 0,
  google::WARNING = 1,
  google::ERROR = 2,
  google::FATAL = 3,
};

FATAL等级的日志会在记录之后终止程序运行,要谨慎使用。google

日志输出宏

LOG(INFO)<<"output info log"
LOG(WARNING)<<"output warning log"
LOG(ERROR)<<"out error log"
LOG(FATAL)<<"out fatal log"

上述四个宏,分别记录四种不一样等级的日志。url

参数设置

Glog经过命令行的方式对运行参数进行设置,其前缀均为FLAGS_,下面列出一些较为经常使用的,给出的都是默认值:

FLAGS_logtostderr = false;            //是否将日志输出到stderr,而非文件
FLAGS_alsologtostderr = false;            //日志记录到文件的同时输出到stderr
FLAGS_colourlogtostderr = flase;            //是否将彩色日志输出到stderr
FLAGS_drop_log_memory = true;            //日志写到文件的时候删除其在内存中的buf
FLAGS_log_prefix = true;            //每行log加前缀,其格式为Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
FLAGS_minloglevel = google::INFO;            //日志最低记录等级
FLAGS_logbuflevel = google::INFO;            //缓存日志的最低等级 , -1表示不缓存,0表示只缓存google::INFO
FLAGS_logbufsecs = 30;            //日志最多缓存的秒数,0表示实时输出
FLAGS_log_dir = "";            //设置日志文件输出目录
FLAGS_max_log_size = 1800;            //最大日志大小(MB), 若是设置为0将默认为1
FLAGS_stop_logging_if_full_disk = false;            //磁盘满中止记录日志

Glog一样提供了一些函数进行参数设置,经常使用的有:

google::SetStderrLogging(google::INFO);            //设置级别高于 google::INFO 的日志同时输出到屏幕
google::SetLogDestination(google::INFO,"./logfiles/INFO/INFO_");            //设置 google::INFO级别的日志存储路径和文件名前缀,一样能够对WARNING,ERROR,FATAL级别进行设置
google::SetLogFilenameExtension("Qt_");            //设置文件名扩展

###有条件的记录日志

LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";            //只有当num_cookies > 10条件成立时,“Got lots of cookies”日志信息才被记录。

LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";            //每隔10次记录一第二天志信息(第一、十一、21……次被执行的时候,记录日志信息)。
 
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " <<google::COUNTER<< "th big cookie";            //size>1024的条件连续成立10次的时候记录日志信息。
 
LOG_FIRST_N(INFO, 20) << "Got the " <<google::COUNTER<< "th cookie";            //当该语句只在首次执行了20次之后记录日志信息。

google::COUNTER表示该语句执行的次数。

###本身作的封装及测试 QGlog.h

#ifndef QGLOG_H
#define QGLOG_H
#include "glog/logging.h"
#include <QObject>

typedef int QGLogSeverityLevel;
const int QINFO = 0, QWARNING = 1, QERROR = 2, QFATAL = 3;

//enum QGLogSeverityLevel
//{
//  QINFO = 0,
//  QWARNING = 1,
//  QERROR = 2,
//  QFATAL = 3,
//};

class QGlog:public QObject
{
    Q_OBJECT
public:
    QGlog(char* name);
    ~QGlog();
    void WriteToLog(QGLogSeverityLevel level, QString info);
private:

};

#endif // QGLOG_H

QGlog.cpp

#include "QGlog.h"
#include <QDir>

QGlog::QGlog(char *name)
{
    QDir dir;
    if(!dir.exists("./logfiles/INFO"))
        dir.mkpath("./logfiles/INFO");
    if(!dir.exists("./logfiles/WARNING"))
        dir.mkpath("./logfiles/WARNING");
    if(!dir.exists("./logfiles/ERROR"))
        dir.mkpath("./logfiles/ERROR");

    google::InitGoogleLogging(name);

    google::SetStderrLogging(google::INFO); //设置级别高于 google::INFO 的日志同时输出到屏幕
    google::SetLogDestination(google::INFO,"./logfiles/INFO/INFO_"); //设置 google::INFO 级别的日志存储路径和文件名前缀
    google::SetLogDestination(google::WARNING,"./logfiles/WARNING/WARNING_");   //设置 google::WARNING 级别的日志存储路径和文件名前缀
    google::SetLogDestination(google::ERROR,"./logfiles/ERROR/ERROR_");   //设置 google::ERROR 级别的日志存储路径和文件名前缀
    google::SetLogFilenameExtension("Qt_");     //设置文件名扩展

    FLAGS_colorlogtostderr = true;    //设置输出到屏幕的日志显示相应颜色
    FLAGS_logbufsecs = 0;        //缓冲日志输出,默认为30秒,此处改成当即输出
    FLAGS_max_log_size = 100;    //最大日志大小为 100MB
    FLAGS_stop_logging_if_full_disk = true;     //当磁盘被写满时,中止日志输出
}

QGlog::~QGlog()
{
    google::ShutdownGoogleLogging();
}

void QGlog::WriteToLog(QGLogSeverityLevel level, QString info)
{
    QByteArray ba = info.toUpper().toLatin1();
    char* ch = ba.data();
    if(level == QINFO)
        LOG(INFO)<<ch;
    else if(level == QWARNING)
        LOG(WARNING)<<ch;
    else if(level == QERROR)
        LOG(ERROR)<<ch;
    else if(level == QFATAL)
        LOG(FATAL)<<ch;
}

main.cpp

#include <QCoreApplication>
#include "QGlog.h"

static QGlog testlog("log");

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    testlog.WriteToLog(QINFO,"QGlog INFO test!");
    testlog.WriteToLog(QWARNING,"QGlog WARNING test!");
    testlog.WriteToLog(QERROR,"QGlog ERROR test!");

    return a.exec();
}