用Node.js和MongoDB简单的日志分析系统的实现
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真的是个好东西。