最新版本号[免费下载]

用Node.JS+MongoDB实现简单的日志分析系统

作者:本站编辑 发布时间:2015-11-24 来源:本站原创 点击数:

在最近的项目中,为了便于分析把项目的日志都存成了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":[ERR:未定义的系统标签(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();
        }
      });
    });
  });
});

同样很简单。


{ZL.Page id="2009版内容分页" num="")请检查标签名是否正确]
本文责任编辑: 加入会员收藏夹 点此参与评论>>
复制本网址-发给QQ/微信上的朋友
AI智能听书
选取音色