用Node.js和MongoDB简单的日志分析系统的实现

用Node.js和MongoDB简单的日志分析系统的实现
在最近的项目中,项目的日志存储在易于分析JSON格式。以前的日志直接在文件中,并mondb正式闯入我的视线并保存日志到mondb。它是保存日志毫无意义,而最重要的是发现业务发展的趋势,系统漏洞,所以从日志。之前,有一个用java写的分析模块,在tomcat下运行。实现了相当重的分量,添加一个新的指标,过程也繁琐,并分析失败因为NFS。总是想重写,首先要使用Ruby on Rails,但已经没有时间去研究和发展(的借口!)我遇到Node.js又在QCon杭州2011。虽然我以前听说过,但我并没有深入研究。听了宿迁淘宝的演讲,有使用Node.js来完成这个日志分析系统的想法。JS前端js服务器,即使壳数据库是JS,很酷,当然关键是少量的代码。

1。用js实现的服务器端代码

为了有一个良好的风格和快速的编写代码,一个简单的框架应采用它是不可避免的。表达实现了大部分的功能,但熟悉它需要花费大量的时间,和它看起来有点重量级项目。在节点。JS的官方网站,有一个聊天演示程序,简单的动作,将URL返回JSON处理。所以我用fu.js直接改写了server.js:

复制代码代码如下所示:

主机= null; / /本地

端口= 8001;

var =要求(),

系统=需要(工具),

要求(URL),

周一=需要(, / request_handler );

fu.listen(编号(process.env.port | |端口),主持人);

fu.get( /
太简单了,对吧但是服务器确实已经建立起来了。

下面的代码在request_handler.js寻找处理的要求:

复制代码代码如下所示:

无功mondb =需要(mondb );

var =要求();
10用户操作

fu.get( / useractiontop10

Mondb.connect('mondb: / /本地:27017 /日志功能(呃,Conn){

conn.collection('action_count功能(呃,Coll){

Coll.find({价值。行动:{ $:user_action } })。排序({价值。计数:1 })。限制(10)。ToArray(功能(呃,Docs){ {)

如果(!ERR){

var动作{ };

var计数{ };

对于(var i = 0;i < docs.length;i++){

/ / console.log(Docs {我});

Action.push(Docs {我}。价值。行动);

Count.push(Docs {我}。值。计数);

}

res.simplejson(200,{行动:行动,计数:计数});
必须记住关闭数据库连接。

Conn.close();

}

});

});

});

});
二、客户机

最重要的日志系统的直观显示,一个插件jQuery使用jqPlot图。首先,使用一个静态的HTML页作为图形显示容器。

复制代码代码如下所示:

会合监控系统



这几乎jqPlot实例的完整副本,好吧,我承认我太懒了。

以下是chart.js是用来显示所生成的图形。

复制代码代码如下所示:

所有图表绘制/存储功能,如果我们想禁用一个图表,只需要

评论推线时把 /功能到数组。

var绘制{ };

排名前10的用户动作开始********************************* / / ******************************

Document.write ('');
无功drawuseractiontop10chart =函数(){()

如果(!$(# useractiontop10chart)。Attr(' ')){

$(# useractiontop10chart)。Attr(' ','small_chart);

}
$ ajax({

异步:假,

网址: / useractiontop10,

DataType:'json,

缓存:false,

成功:函数(数据){

尝试{

$(# useractiontop10chart')Html(‘);
美元。jqplot('useractiontop10chart,{数量},{数据。)

标题:前10个用户操作

seriesdefaults:{

渲染:jqplot.barrenderer美元,

rendereroptions:{ filltozero:true},

pointlabels:{

显示:真实,

ypadding:1

}

},

axesdefaults:{

tickrenderer:jqplot.canvasaxistickrenderer美元,

tickoptions:{

角度:- 30,

FontSize:'12px

}

},

轴:{

Xaxis:{

渲染:jqplot.cateryaxisrenderer美元,

蜱:data.action

},

Yaxis:{

Pad: 1.05

}

}

});

} catch(e){

/ /警报(e.message);

}

}

});

}
Draws.push('drawuseractiontop10chart);
排名前10的用户操作端************************************ / / *******************************

图***************** / / ***********开始
将您的图表绘制功能放在这里

1。为图表插入一个div

2。实现功能图

3。将函数名推入数组绘制
图******************* / / ***********结束
所有图表

无功drawallcharts =函数(){()

对于(var i = 0;i < draws.length;i++){

eval(画{我} +());

}
在5分钟内回忆起自己。

window.settimeout(drawallcharts,5×60×1000);

}
$(函数(){())

DrawAllCharts();

});
服务器端和客户端代码都有,然后运行查看效果:
什么东西似乎被遗忘了测井分析代码。

三。使用mondb增量MapReduce的日志分析

这是在mondb文件增量MapReduce的介绍。在一开始,它一直被认为是mondb实现了流处理,可以自动执行增量MapReduce。原来我错了,文件没有写这个,就如何建立MapReduce的增量执行。

为了方便,我写mondb MapReduce使用Javascript在一个单独的js文件,然后执行它定期通过crontab。统计。JS代码:

复制代码代码如下所示:

/ **************文件执行的每5分钟/等/ / ***************** crontab。

无功action_count_map =函数(){()

发出(this.action,{行动:this.action,计数:1 });

}

无功action_count_reduce =功能(键,值){

var计数= 0;

values.foreach(函数(值){)

数= value.count;

});

返回{操作:键,计数:计数};

}
Db.log.mapReduce(action_count_map,action_count_reduce,{查询:{ 'action_count:{ 1 } },为NE::{ } }减少:'action_count);

db.log.update({ 'action_count:{ 1 } },为NE:{ $集:{ 1 } },'action_count:假,真的);
这个想法很简单:

1。在map中,每个操作访问号设置为1。

2。减少、计算同一动作的访问次数。

三.执行MapReduce。查询指定为action_count ',这不等于1,即没有执行的统计;结果存储在action_count的收集和减少选项是用来表示作为下一个的输入减少的结果。

4。当前所有的日志记录设置to'action_count'is值1,表明统计已经完成。不知道这是否会导致记录尚未统计和更新看经验启迪英雄!

定期执行stats.js壳:

复制代码代码如下所示:

* / 5 *根CD /根/日志;非本地:27017 /日志stats.js
嗯,这是所有代码,没有什么特别神秘的地方,但是Node.js真的是个好东西。

tag:日志分析系统简单电脑软件Nodejs

相关内容