用Node.js和MongoDB简单的日志分析系统的实现
2023-11-28 14:39:34
在最近的项目中,项目的日志存储在易于分析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:日志分析系统 简单 电脑软件 Node js
相关内容