跳转到主内容
极星编程网:以代码为星,赴技术山海!

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

在最近的项目中,为了便于分析把项目的日志都存成了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             //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(); } }); }); }); }); Node.js中文手册 Node.js 中文手册下载 下载 二、客户端 日志系统的最重要的是可视化显示,这里使用了JQuery的一个插件 jqPlot Chart 。首先使用一个静态的HTML页面,用来作为图形显示的容器: 复制代码 代码如下: Rendezvous Monitor System [if lt IE 9]><script src="js/excanvas.js"><![endif]--><br>     <script src="js/jquery.min.js"></script>
    <script src="js/jquery.jqplot.min.js"></script>
    <script src="js/plugins/jqplot.barRenderer.min.js"></script>
    <script src="js/plugins/jqplot.categoryAxisRenderer.min.js"></script>
    <script src="js/plugins/jqplot.canvasTextRenderer.min.js"></script>
    <script src="js/plugins/jqplot.canvasAxisTickRenderer.min.js"></script>
    <script src="js/plugins/jqplot.canvasAxisLabelRenderer.min.js"></script>
    <script src="js/plugins/jqplot.pointLabels.min.js"></script>
    <script src="js/plugins/jqplot.dateAxisRenderer.min.js"></script>
    <script src="js/plugins/jqplot.json2.min.js"></script>
   
   
    <script src="js/charts.js"></script>
 
 
 

几乎是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 = [];

/****************************** TOP 10 User Action Start *********************************/
document.write('

');


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');


/******************************* TOP 10 User Action End ************************************/

/*********** Chart Start *****************/


//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


/*********** Chart End *******************/

// Draw all charts
var drawAllCharts = function(){
  for(var i = 0; 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的代码:

复制代码 代码如下:

/************** The file is executed per 5 minutes by /etc/crontab.*****************/
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真的是个好东西。

相关文章

Node.js 使用 amqplib 进行批量手动应答(ch.ackAll)会有哪些潜在的业务风险?

Node.js 纯异步模型下如何防范 RabbitMQ 消息重复消费?基于 Redis 分布式锁方案

如何在纯浏览器环境中安全调用PowerShell脚本(无Node.js)

Node.js使用RabbitMQ怎么保证消息的手动ACK和错误重回队列?

Node.js 消费端长时间挂起处理大数据导致 RabbitMQ 报错 “Heartbeat missing” 怎么解?

相关标签:

node.js mongodb

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

上一篇:javascript显式类型转换实例分析_javascript技巧 下一篇:javascript原始值和对象引用实例分析_javascript技巧

热门AI工具

更多
DeepSeek

幻方量化公司旗下的开源大模型平台

AI编程开发AI聊天问答
豆包大模型

字节跳动自主研发的一系列大型语言模型

AI编程开发AI大模型
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

AI办公学习Agent智能体
通义千问

阿里巴巴推出的全能AI助手

Agent工具Agent智能体
Claude

Anthropic发布的与ChatGPT竞争的聊天机器人

AI编程开发AI聊天问答
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

AI编程开发应用开发
Hermes Agent

一位与您共同成长的Agent

Agent智能体桌面Agent
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

图片拼接图画生成
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

AI编程开发AI文本写作

相关专题

更多
GitHub Copilot 安装与快速上手攻略

面向开发者的 GitHub Copilot 快速入门指南,从订阅方案选择(Individual / Business / Enterprise)与免费额度说明讲起,详细介绍 VS Code / JetBrains(IntelliJ / PyCharm / WebStorm)/ Neovim 等主流编辑器的插件安装与账号登录配置、代码补全的触发方式与 Tab 采纳操作、行内建议(Inline Suggestion)与多候选方案切换、补全结

7

2026.05.28

GitHub Copilot企业开发教程大全

本专题介绍GitHub Copilot企业版、团队协作、AI Agent、自动代码审查、企业安全管理及大型项目开发工作流。阅读下面的文章了解更多详细内容。

8

2026.05.28

GitHub Copilot开发工具推荐

本专题整理了GitHub Copilot必备开发工具,包括VS Code、JetBrains、Docker、Postman、Warp、Cursor等AI开发环境与效率工具。阅读下面的文章了解更多详细内容。

8

2026.05.28

GitHub Copilot新手使用教程大全

本专题涵盖GitHub Copilot安装配置、使用教程、AI代码生成、Copilot Chat、终端CLI、Agent模式与项目开发实战案例。阅读下面的文章了解更多详细内容。

4

2026.05.28

GitHub Copilot智能编程AI代码助手教程合集

提供GitHub Copilot安装教程、AI代码补全、Copilot Chat、Agent模式、VS Code集成、JetBrains插件、开发技巧与AI编程最佳实践。

45

2026.05.27

Codex AI编程工具新手指南

全面解析Codex AI编程工具的核心原理、功能特点与实际用途,提供适合新手的Codex入门教程、环境配置方法、代码生成演示与常见问题解答,帮助开发者快速掌握AI自动写代码能力,提升编程学习与开发效率。

32

2026.05.27

Notion AI项目管理零基础入门

本专题聚焦Notion AI项目管理,系统整理项目看板搭建、任务分配、进度追踪及团队协作等核心内容,助力用户高效管理项目全流程。适合初学者快速掌握Notion AI在项目管理中的实用技巧。

19

2026.05.27

Notion AI智能写作实操指南

本专题聚焦 Notion AI 智能写作功能,涵盖 AI 辅助写作、内容生成、文案润色、多语言翻译等实用技巧,帮助用户快速提升文章创作、办公整理与内容输出效率,轻松完成多场景写作需求。

17

2026.05.27

Notion AI全功能使用教程

本专题围绕 Notion AI 基础入门展开,涵盖注册登录、界面操作、核心功能使用及常见应用技巧,帮助新手快速熟悉 Notion AI 的内容整理、智能创作与协同办公能力,轻松提升学习与工作效率。

34

2026.05.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板
  • [图片特效]支持移动触摸设备js幻灯片
  • [图片特效]jQuery图片弹出翻转特效代码
  • [图片特效]JS图片背景全屏代码
  • [图片特效]曲面屏图片高亮特效代码
  • [图片特效]jQuery带文字动画图片轮播代码
  • [图片特效]jQuery商城淡入淡出焦点图
  • [图片特效]jQuery触屏手机拖拽幻灯片
  • [图片特效]CSS3选项动画切换效果
  • [图片特效]css3立体相册突出效果 css3立体相册突出效果代码下载
  • [图片特效]全屏banner轮播切换CSS3动画

相关下载

更多
自制php框架源码
如家快捷酒店预订源码 for php
php商城系统
淘源码商城PHP淘宝查信誉
PHP房产程序[BBWPS]
PHP简约自动发卡平台个人版
ERMEB域名PHP离线网络授权系统

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册

共0课时 | 0人学习

Node.js 教程

共57课时 | 17.5万人学习

【web前端】Node.js快速入门

共16课时 | 2.3万人学习

最新文章

更多
WebSocket负载均衡中维持连接稳定性教程 会话保持与健康检查方法
如何在 React 中正确渲染 Firestore Timestamp 字段
如何可靠地拦截并取消所有 contenteditable 元素的输入行为
Node.js 使用 amqplib 进行批量手动应答(ch.ackAll)会有哪些潜在的业务风险?
如何从 HTML 元素的 onclick 属性中提取函数参数并构建对象数组
如何识别 嵌套函数中的变量遮蔽 (Variable Shadowing) 引发的逻辑混乱
如何解决计算属性名未通过动态验证导致的不可枚举异步属性报错
怎么避免在图片懒加载逻辑中 addEventListener 绑定过多导致内存占满
Nginx配置WebSocket负载均衡教程 解决WebSocket连接超时方法
如何利用 GraphQL 的 POST 体封装 统一 fetch 的入口函数设计

相关文章