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

修改google glog默认支持异步写

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

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

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

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

#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <windows.h>
#include <glog/logging.h>
#include <random>
#include <chrono>

typedef std::chrono::high_resolution_clock::time_point time_point;
typedef std::chrono::duration<int64_t,std::ratio<1, 1000> > millisecond;
typedef std::chrono::duration<int64_t,std::ratio<1, 1000000> > 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<microsecond>(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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐