参考博文
google-glog安装使用
Google-glog 日志库使用手记
Google glog 使用
glog功能介绍
Google glog是Google开发的C++库,提供了C++风格的流操作与宏,实现程序日志记录。
下载、安装及环境配置
Google glog目前托管在GitHub,目前最新的稳定版本为V0.35版,需要注意的是,直接用Git下载的话,会直接选master版本,V0.35版只能够直接下载ZIP文件。
下载完成后解压,运行根目录下的google-glog.sln,使用VS编译,注意选择Debug和Release,以及Win32和X64(这里选择X64,Debug)。
编译完成后,根目录下会生成一个名为X64的文件夹,其下有一个Debug文件夹,该文件夹下有glog的动态链接库libglog.dll,libglog.lib文件,静态链接库libglog_static.lib。在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"
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等级的日志会在记录以后终止程序运行,要谨慎使用。
日志输出宏
LOG(INFO)<<"output info log"
LOG(WARNING)<<"output warning log"
LOG(ERROR)<<"out error log"
LOG(FATAL)<<"out fatal log"
上述四个宏,分别记录四种不同等级的日志。
参数设置
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次记录一次日志信息(第1、11、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();
}