修改google glog默认支持异步写

昨天跟同事商量,他希望用日志库越简单越好,我就想到可以内置异步写,但是x64平台有点问题,glog链接的时候不知道在哪链接的,搞得很蛋疼,采取暴力的解决办法:删除所有 的GOOLE_DLL_EXPORT,只生成静态lib,这样就可控了。

内部添加了两个文件,active,objectpool;active就是之前封装的produter-consumer模式;如果本着最简化的原则还可以用STL内置的allocator来替换现在的objectpool,之前分析过这个内存池,也是很有效的,以后可考虑修改。

因为glog内部默认就是用logfileobject来写日志,所以直接在这个类里做修改就行。

client的用法当然就没什么变化了:

#define GLOG_NO_ABBREVIATED_SEVERITIES
#include 
#include 
#include 
#include 

typedef std::chrono::high_resolution_clock::time_point time_point;
typedef std::chrono::duration > millisecond;
typedef std::chrono::duration > microsecond;


void writeLog(void* para)
{
	std::random_device rd;
	int lognum = *(int*)para;
	for (int i = 0; i < lognum; ++i){
		int j = 0;
		do 
		{
			++j;
		} while (j < 1000);

		LOG(INFO) << "how are " << rd() << " cookies";
	}
}
using namespace google;
int main(int argc, char* argv[]) {

	auto start_time = std::chrono::high_resolution_clock::now();
	google::InitGoogleLogging("test/testsss");

	google::SetLogDestination(google::GLOG_INFO, "../x64/Release/Release"); 
	int num_cookies = 0;
	int lognum = 100;
	int threadNum = 1;
	std::thread* threads = new std::thread[threadNum];
	for (int i = 0; i < threadNum; ++i)
	{
		threads[i] = std::thread(writeLog, &lognum);
	}

	for (int i = 0; i < threadNum; ++i)
	{
		threads[i].join();
	}

	auto application_end_time = std::chrono::high_resolution_clock::now();
	auto application_time_us = std::chrono::duration_cast(application_end_time - start_time).count()/1000;
	LOG(INFO) << "threadglog total use " << application_time_us << "s";
	google::ShutdownGoogleLogging();
}

另外fileobject在设置一些属性的时候会加锁,其实我们应用时一般只会在一个线程里把所有属性都once inited,所有加锁已无必要。但暂时保留。可以定制的地方还很多。

最后开始正式维护gitbub上自己的项目,也就是本项目:https://github.com/boyxiaolong/Proejcts

表示还没有完全开始造轮子,but a good start.

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