glog日志库在window上的安装和使用

编译

1.通过git从github拉取最新版本代码:

git clone https://github.com/google/glog.git

glog日志库在window上的安装和使用_第1张图片
2.运行完cmake命令后,会生成glog.sln文件,双击打开,它便是VS解决方案。然后直接运行编译,这样会直接生成lib静态库。为了生成dll动态库,我们需要使用cmake-gui,勾选上"BUILD_SHARED_LIBS"选项,这样生成的glog工程默认就是dll库。编译完后就会在Debug或Release目录生成lib静态库或者dll动态库。
按需要编译库。以静态库为例,动态库多一步将libglog.dll拷贝到程序目录下。分别编译Debug和Release,将Debug版的重命名为libglog_static_d.lib。将编译的lib文件拷贝到根目录\src\glog下,\src\glog是头文件目录。这个版本的静态库在试用时并未发现有内存泄露问题。

3.头文件会放在下载的源码glog目录中
glog日志库在window上的安装和使用_第2张图片
4.在解决方案下有四个工程:libglog(是动态链接库工程,生成libglog.dll和libglog.lib),libglog_static(是静态库工程,生成libglog_static.lib,运行时不需要libglog.dll),logging_unittest和logging_unittest_static是相应的测试工程。

5.不需要更改工程属性。平台工具集是否是Windows XP(v140_xp)好像并不影响。Glog不支持Unicode宽字符集,工程属性字符集保持多字节字符集。“C/C++”-“代码生成”中的“运行库”,libglog动态库工程必须选择“多线程DLL”或“多线程调试DLL”,libglog_static静态库工程必须选择“多线程”或“多线程调试”。

6.使用静态库必须添加#define GOOGLE_GLOG_DLL_DECL。动态库不必添加。
添加库文件:#pragma comment(lib,“glog/libglog_static.lib”)。针对Debug和Release版,用#ifdef控制。
因windows.h中定义的宏ERROR,与glog中定义的宏ERROR冲突,所以如果#include 后要添加#define GLOG_NO_ABBREVIATED_SEVERITIES,并且代码中要用google::GLOG_ERROR来代替原来的google::ERROR,相应的其他也改为:GLOG_INFO、GLOG_WARNING、GLOG_FATAL。

使用

#include "glog/logging.h"
#include 
#include 
using namespace std;

int main(int argc, char **argv)
{
	//要将日志输出到文件,需要先对日志库进行初始化:
	//默认会将日志输出到"C:\Users\user\AppData\Local\Temp"目录下。
	google::InitGoogleLogging("log");//括号内是程序名

	//设置日志保存目录,注意这个目录必须是已经存在,否则不能生成日志文件
	//FLAGS_log_dir = "./log/";

	//日志输出文件名
	string home = "./log/";  //要先创建此目录,否则运行报错.
	string info_log = home + "master_info_";
	google::SetLogDestination(google::INFO, info_log.c_str());
	string warning_log = home + "master_warning_";
	google::SetLogDestination(google::WARNING, warning_log.c_str());
	string error_log = home + "master_error_";
	google::SetLogDestination(google::ERROR, error_log.c_str());
	string fatal_log = home + "master_fatal_";
	google::SetLogDestination(google::FATAL, fatal_log.c_str());

	google::SetLogFilenameExtension("log_");
	FLAGS_colorlogtostderr = true;  //设置记录到标准输出的颜色消息(如果终端支持)
	FLAGS_logbufsecs = 0;  //设置可以缓冲日志的最大秒数,0指实时输出
	FLAGS_max_log_size = 10;  //设置最大日志文件大小(以MB为单位),超过会对文件进行分割
	FLAGS_stop_logging_if_full_disk = true;  //设置是否在磁盘已满时避免日志记录到磁盘

	//输出日志
	LOG(INFO) << "info test";  //输出一个Info日志
	LOG(WARNING) << "warning test";  //输出一个Warning日志
	LOG(ERROR) << "error test";  //输出一个Error日志
	//LOG(FATAL) << "fatal test";  //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序
	//变量输出
	cv::Mat  img = cv::Mat::ones(cv::Size(5, 5), CV_8UC1);
	LOG(INFO) << "\n" << img << endl;
	int a = 1000;
	LOG(INFO) << a << endl;
	
	/***条件输出***/
	for (int i = 0; i < 20; i++)
	{
		LOG_IF(INFO, i > 15) << "i > 15"; //当i > 15时,记录Log;
	}
	//周期性的输出日志,记录该语句被执行次数,从1开始,
	//在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
	for (int i = 0; i < 20; i++)
	{
		LOG_EVERY_N(INFO, 3) << "i: " << i;
	}
	//条件加周期记录,每隔n次输出Log。不过要注意,
	//是先每隔 3 次去判断条件是否满足,如果是则输出日志;
	//而不是当满足某条件的情况下,每隔 3 次输出一次日志信息
	for (int i = 0; i < 20; i++)
	{
		LOG_IF_EVERY_N(INFO, i > 10, 3) << "i > 10, i: " << i; //当i > 10之后,每隔3次输出一次信息;
	}
	//限制Log输出次数,只输出前n次信息
	for (int i = 0; i < 20; i++) {
		LOG_FIRST_N(INFO, 4) << "i: " << i; // 输出前4次Log
	}
	//关闭日志库
	google::ShutdownGoogleLogging();//程序完结时必须有,否则会内存泄露

	//几个参数和函数
	//FLAGS_logtostderr = true;  //设置日志消息是否转到标准输出而不是日志文件
	//FLAGS_alsologtostderr = true;  //设置日志消息除了日志文件之外是否输出到标准输出
	//FLAGS_log_prefix = true;  //设置日志前缀是否应该添加到每行输出
	//FLAGS_minloglevel = google::GLOG_WARNING;   //设置最小处理日志的级别
	//google::SetLogDestination(google::GLOG_INFO, "log/prefix_");  //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
	//google::SetLogFilenameExtension("logExtension");  //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
	//google::SetStderrLogging(google::GLOG_INFO);  //大于指定级别的日志都输出到标准输出
	system("pause");
	return 0;
}

参考:

glog的编译和使用
glog使用教程
Google-glog 日志库使用手记

你可能感兴趣的:(C++)