我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

在最近的项目中,为了便于分析把项目的日志都存成了JSON格式。之前日志直接存在了文件中,而MongoDB适时闯入了我的视线,于是就把log存进了MongoDB中。log只存起来是没有意义的,最关键的是要从日志中发现业务的趋势、系统的性能漏洞等。之前有一个用Java写的分析模块,运行在Tomcat下。实现相当的重量级,添加一个新指标的流程也比较繁琐,而且由于NFS的原因还导致分析失败。一直想改写,最初想用Ruby On Rails,可是一直没有时间学习和开发(在找借口啊!)。在杭州QCon 2011上又遇到了Node.js,虽然之前也听说过,但是没有深入研究,听了淘宝苏千 的演讲后,当时了就有要用Node.js实现这个日志分析系统的想法。前端用JS,服务器用JS,就连数据库的Shell都是JS,想想就够酷的——当然最关键是代码量小。

一、用Node.js实现服务器端代码

为了有良好的风格和快速的代码编写,不可避免地应该采用一个简单的框架。Express实现了大部分的功能,可是好需要花一定时间熟悉,并且看起来对这个项目来说有些重量级。在Node.js的官网上有一个聊天的Demo ,这个代码简单移动,封装了对URL的处理和返回JSON。于是我就直接使用了fu.js,重写了server.js:

HOST = null; // localhost

PORT = 8001;

var fu = require("./fu"), sys = require("util"), url = require("url"), mongo = require("./request_handler");

fu.listen(Number(process.env.PORT || PORT), HOST);

fu.get("/", fu.staticHandler("index.html"));

太简单了吧?!不过的确是这样,一个服务器已经建立起来了。
下面看处理请求的request_handler.js代码:

var mongodb = require("mongodb");

var fu = require("./fu");

// TOP 10 user Action fu.get("/userActionTop10", function(req, res){ mongodb.connect('mongodb://localhost:27017/log', function(err, conn){ conn.collection('action_count', function(err, coll){ coll.find({"value.action":{$in:user_action}}).sort({"value.count":-1}).limit(10).toArray(function(err, docs){ if(!err){ var action = []; var count = []; for(var i = 0; i < docs.length; i ++){ //console.log(docs[i]); action.push(docs[i].value.action); count.push(docs[i].value.count); } res.simpleJSON(200, {action:action, count:count}); // 一定要记得关闭数据库连接 conn.close(); } }); }); }); });

二、客户端

日志系统的最重要的是可视化显示,这里使用了JQuery的一个插件jqPlot Chart 。首先使用一个静态的HTML页面,用来作为图形显示的容器:

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Rendezvous Monitor System</title>

    <!--[if lt IE 9]><script class="lazy" data-src="js/excanvas.js"><![endif]-->

    <script class="lazy" data-src="js/jquery.min.js"></script>

    <script class="lazy" data-src="js/jquery.jqplot.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.barRenderer.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.categoryAxisRenderer.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.canvasTextRenderer.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.canvasAxisTickRenderer.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.canvasAxisLabelRenderer.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.pointLabels.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.dateAxisRenderer.min.js"></script>

    <script class="lazy" data-src="js/plugins/jqplot.json2.min.js"></script>

    <link rel="stylesheet" href="js/jquery.jqplot.min.css">

    <link rel="stylesheet" href="style/base.css">

    <script class="lazy" data-src="js/charts.js"></script>

  </head>

  <body>

  </body>

</html>

几乎是jqPlot的示例中的完整拷贝,好吧,我承认我太懒了。
下面是看用来显示生成图形的chart.js:

// Store all chart drawing function, if we want to disable one chart, only need

// comment the push line when putting fucntion into the array.

var draws = [];

document.write('<div id="userActionTop10Chart"></div>');

var drawUserActionTop10Chart = function(){ if(!$("#userActionTop10Chart").attr('class')){ $("#userActionTop10Chart").attr('class', 'small_chart'); }

$.ajax({ async:false, url: '/userActionTop10', dataType:'json', cache: false, success:function(data){ try{ $('#userActionTop10Chart').html('');

$.jqplot('userActionTop10Chart', [data.count], { title: "TOP 10 User Action", seriesDefaults:{ renderer:$.jqplot.BarRenderer, rendererOptions: {fillToZero: true}, pointLabels: { show:true, ypadding:1 } }, axesDefaults:{ tickRenderer:$.jqplot.CanvasAxisTickRenderer, tickOptions: { angle: -30, fontSize: '12px' } }, axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: data.action }, yaxis: { pad: 1.05 } } }); }catch(e){ //alert(e.message); } } }); }

draws.push('drawUserActionTop10Chart');

//Put your chart drawing function here //1. insert a div for the chart //2. implement the function drawing chart //3. push the function name into the array draws

// Draw all charts var drawAllCharts = function(){ for(var i = 0; i < draws.length; i ++){ eval(draws[i] + "()"); }

//Recall itself in 5 minute. window.setTimeout(drawAllCharts, 5 * 60 * 1000); }

// $(function(){ drawAllCharts(); });

服务器端和客户端的代码都有了,那就跑起来看效果吧:

查看图片

好像忘了什么?日志的分析代码。

三、使用MongoDB 增量式MapReduce实现日志分析

在MongoDB的文档中有关于Incremental MapReduce的介绍。刚开始一直以为MongoDB实现Streaming处理,可以自动执行增量式的MapReduce。最后发现原来是我理解有误,文档里并没有写这一点,只是说明了如何设置才能增量执行MapReduce。

为了方便,我把MapReduce使用MongoDB的JavaScript写在了单独的js文件中,然后通过crontab定时执行。stats.js的代码:



var action_count_map = function(){

  emit(this.action, {action:this.action, count:1});

}

var action_count_reduce = function(key, values){ var count = 0; values.forEach(function(value){ count += value.count; }); return {action:key, count : count}; }

db.log.mapReduce(action_count_map, action_count_reduce, {query : {'action_count' : {$ne:1}},out: {reduce:'action_count'}});

db.log.update({'action_count':{$ne:1}}, {$set:{'action_count':1}}, false, true);

思路很简单:
1. 在map中将每个action访问次数设为1
2. reduce中,统计相同action的访问次数
3. 执行mapReduce。指定了查询为‘action_count'不等于1,也就是没有执行过该统计;将结果存储在‘action_count'集合,并且使用reduce选项表示该结果集作为下次reduce的输入。
4. 在当前所有日志记录设置'action_count'的值为1,表示已经执行过该统计。不知道这种是否会造成没有还没有统计过的记录也被更新??望有经验的大侠赐教!

定时执行stats.js的shell:

*/5 * * * * root cd /root/log; mongo localhost:27017/log stats.js

好了,这就是全部的代码,没有什么特别玄妙的地方,不过Node.js真的是个好东西。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

在最近的项目中,为了便于分析把项目的日志都存成了JSON格式。之前日志直接存在了文件中,而MongoDB适时闯入了我的视线,于是就把log存进了MongoDB中。log只存起来是没有意义的,最关键的是要从日志中发现业务的趋势、系统的性能漏洞
2022-06-04

ASP.NET Core的日志系统实例分析

本文小编为大家详细介绍“ASP.NET Core的日志系统实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.NET Core的日志系统实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。.net
2023-07-02

Linux系统日志的实时分析工具

在Linux系统中,有多个实时分析日志的工具。以下是一些常用的工具:tail:tail命令用于查看文件的末尾内容,在日志监控中经常用到,可以实时查看日志的最后几行内容。通过执行tail -f命令,可以持续输出文件末尾的内容,这对于实时监控日
Linux系统日志的实时分析工具
2024-09-25

Golang与RabbitMQ实现分布式日志收集与分析系统

要使用Golang和RabbitMQ来实现分布式日志收集与分析系统,可以按照以下步骤进行:1. 安装RabbitMQ:首先需要在系统中安装RabbitMQ。可以根据官方文档下载和安装RabbitMQ服务器。2. 创建消息队列:使用Golan
2023-10-08

基于MongoDB的实时日志分析与报警系统搭建经验总结

在当今信息时代,日志分析与报警系统对于企业的数据管理和安全至关重要。随着云计算和大数据的兴起,传统的关系型数据库已经无法满足日益增长的数据量和实时性需求。在这样的背景下,NoSQL数据库成为了一种备受关注的选择。本文将分享基于MongoDB
基于MongoDB的实时日志分析与报警系统搭建经验总结
2023-11-02

基于MongoDB的实时日志分析与可视化系统搭建经验总结

基于MongoDB的实时日志分析与可视化系统搭建经验总结引言:随着互联网的迅猛发展,各个企业面临着大数据处理和分析的挑战。日志分析是企业运营和安全管理的重要组成部分,搭建一个高效的日志分析与可视化系统对企业决策和问题排查非常关键。本文将总结
基于MongoDB的实时日志分析与可视化系统搭建经验总结
2023-11-03

基于MongoDB的日志分析与监控系统搭建经验总结

一、需求分析与系统设计随着互联网和移动设备的普及,各类网络应用和系统的日志数量急剧增长。对这些海量的日志进行分析和监控可以帮助企业实时了解系统运行情况,发现潜在的问题并进行及时修复,提高系统的稳定性和可靠性。为了满足这一需求,我们团队基于M
基于MongoDB的日志分析与监控系统搭建经验总结
2023-11-04

如何在Linux系统中通过PHP脚本实现日志分析

引言:日志分析对于网站运营和系统管理来说是非常重要的一项任务。通过对日志进行分析,我们可以了解用户行为、网站访问情况以及系统运行状态等信息,从而为网站优化和系统调整提供依据。在Linux系统中,可以使用PHP脚本来实现日志分析,并根据具体需
2023-10-21

基于MongoDB的实时日志分析与异常检测系统搭建经验总结

随着互联网和移动设备的普及,日志数据的产生量也在不断增加,如何高效地对日志数据进行分析和检测异常成为了一个非常重要的问题。本文将介绍如何基于MongoDB搭建一个实时日志分析和异常检测系统,并分享一些经验总结。一、MongoDB简介Mong
基于MongoDB的实时日志分析与异常检测系统搭建经验总结
2023-11-03

使用Go语言开发实现高性能的日志分析系统

随着互联网的快速发展和智能化的推进,数据的生成和积累已经达到了一个空前的规模。在众多的业务系统中,日志数据是最为重要的一部分,它包含了系统运行的各个环节的信息,是进行故障排查、性能优化以及安全审计的重要依据。为了更有效地分析日志数据,提高系
使用Go语言开发实现高性能的日志分析系统
2023-11-20

Go语言开发实现分布式日志分析系统的方法与技巧

Go语言开发实现分布式日志分析系统的方法与技巧摘要:随着大数据时代的到来,日志分析成为了企业必不可少的一项工作。本文介绍了以Go语言为基础,开发实现分布式日志分析系统的方法与技巧。文章从系统架构设计、数据收集、分布式处理、数据存储与查询等方
Go语言开发实现分布式日志分析系统的方法与技巧
2023-11-20

shell脚本怎么实现的网站日志分析统计

本篇内容主要讲解“shell脚本怎么实现的网站日志分析统计”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“shell脚本怎么实现的网站日志分析统计”吧!写了个shell脚本,可以用来统计每天的访问
2023-06-09

Ubuntu编译内核模块和内容体现系统日志中的示例分析

这篇文章给大家分享的是有关Ubuntu编译内核模块和内容体现系统日志中的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.Linux登陆界面1.检查当前文件目录:通过Xshell连接Linux系统后输入命
2023-06-22

如何利用MySQL和Go语言开发一个简单的日志管理系统

如何利用MySQL和Go语言开发一个简单的日志管理系统引言:日志是软件开发中经常用到的重要组成部分,它可以帮助我们追踪问题、记录用户操作、监控系统性能等。在本文中,我将通过结合MySQL和Go语言,教你如何开发一个简单的日志管理系统,并提供
2023-10-22

Golang与RabbitMQ实现分布式日志收集和分析的细节和技巧

在Golang中使用RabbitMQ实现分布式日志收集和分析的细节和技巧如下:1. 安装RabbitMQ:首先,需要安装和配置RabbitMQ服务器。可以从RabbitMQ官方网站下载并安装RabbitMQ。安装完成后,可以使用默认的gue
2023-10-08

编程热搜

目录