首頁 web前端 js教程 Node.js和MongoDB實作簡單日誌分析系統_node.js

Node.js和MongoDB實作簡單日誌分析系統_node.js

May 16, 2016 pm 04:02 PM
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();
        }
      });
    });
  });
});

二、客戶端

日誌系統的最重要的是視覺化顯示,這裡使用了JQuery的一個插件jqPlot Chart 。首先使用靜態的HTML頁面,用來作為圖形顯示的容器:

複製程式碼 程式碼如下:



 
   
    交會監控系統
   
    腳本>
    腳本>
    腳本>
   
   
   
   
    腳本>
   
   
   
   
    腳本>
  頭>
 
  身體>

幾乎是jqPlot的範例中的完整拷貝,好吧,我承認我太懶了。 下面看一下用來顯示生成圖形的chart.js:

複製程式碼如下程式碼:

// すべてのチャート描画関数を保存します。1 つのチャートを無効にしたい場合は、
だけが必要です // 関数を配列に入れるときにプッシュ行をコメント化します。
var 描画 = [];

/****************************** トップ 10 ユーザーアクション開始 ***************** ****************/
document.write('

');


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


  $.ajax({
    非同期:false,
    URL: '/userActionTop10',
    データ型:'json',
    キャッシュ: false、
    成功:関数(データ){
      試してみてください{
        $('#userActionTop10Chart').html('');


        $.jqplot('userActionTop10Chart', [data.count], {
          タイトル: "ユーザー アクション トップ 10",
          シリーズデフォルト:{
            レンダラー:$.jqplot.BarRenderer,
            rendererOptions: {fillToZero: true},
            pointLabels: {
              表示: true、
              ypadding:1
            }
          }、
          axesDefaults:{
            tinyRenderer:$.jqplot.CanvasAxisTickRenderer,
            ティックオプション: {
              角度: -30、
              フォントサイズ: '12px'
            }
          }、
          軸: {
            xaxis: {
              レンダラ: $.jqplot.CategoryAxisRenderer,
              ティック: data.action
            }、
            yaxis: {
              パッド:1.05
            }
          }
        });
      }キャッチ(e){
        //alert(e.message);
      }
    }
  });
}


draws.push('drawUserActionTop10Chart');


/******************************* トップ 10 ユーザーアクション終了 **************** ********************/

/*********** チャート開始 *****************/


//チャート描画関数をここに置きます
//1.チャートの div を挿入
//2.関数描画チャートを実装します
//3.関数名を配列にプッシュします。draws


/*********** チャート終了 *******************/

// すべてのチャートを描画します
vardrawAllCharts = function(){
  for(var i = 0; i     eval(draws[i] "()");
  }


 // 5 分後に呼び出します。
 window.setTimeout(drawAllCharts, 5 * 60 * 1000);
}


//
$(関数(){
  drawAllCharts();
});

サーバー端末とゲスト端末の代価都有了,那就跑起看看効果吧:

良い意味で何を忘れましたか?日志の分析コード。

三、MongoDB 增量式 MapReduce 实现日志分析を使用します

MongoDB のドキュメントには、増分 MapReduce に関するメディアが含まれています。MongoDB がストリーミング処理を実行するために開始され、自動で増量式の MapReduce が実行されます。これは、MapReduce を大量に実行できないように設定する方法を説明するだけです。

便宜上、MapReduce で MongoDB を使用する JavaScript を個別の js ファイルに書き込み、その後 crontab 経由で実行します。stats.js のコード:


复制代码代码如下:

/************** /etc/crontab 每 5 分鐘執行一次檔案。 *****************/
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真的是個好東西。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

navicat怎麼連mongodb navicat怎麼連mongodb Apr 24, 2024 am 11:27 AM

要使用 Navicat 連接 MongoDB,您需要:安裝 Navicat建立 MongoDB 連接:a. 輸入連接名稱、主機位址和連接埠b. 輸入認證資訊(如果需要)新增 SSL 憑證(如果需要)驗證連線儲存連接

Golang 和 Node.js 在後端開發的對比 Golang 和 Node.js 在後端開發的對比 Jun 03, 2024 pm 02:31 PM

Go和Node.js在類型化(強/弱)、並發(goroutine/事件循環)、垃圾收集(自動/手動)上有差異。 Go具備高吞吐量、低延遲,適用於高負載後端;Node.js擅長異步I/O,適合高並發、短請求。兩者的實戰案例包括Kubernetes(Go)、資料庫連線(Node.js)、網路應用程式(Go/Node.js)。最終選擇取決於應用程式需求、團隊技能和個人偏好。

net4.0有什麼用 net4.0有什麼用 May 10, 2024 am 01:09 AM

.NET 4.0 用於創建各種應用程序,它為應用程式開發人員提供了豐富的功能,包括:物件導向程式設計、靈活性、強大的架構、雲端運算整合、效能最佳化、廣泛的程式庫、安全性、可擴展性、資料存取和行動開發支援。

無伺服器架構中Java函數與資料庫的集成 無伺服器架構中Java函數與資料庫的集成 Apr 28, 2024 am 08:57 AM

在無伺服器架構中,Java函數可以與資料庫集成,以存取和操作資料庫中的資料。關鍵步驟包括:建立Java函數、設定環境變數、部署函數和測試函數。透過遵循這些步驟,開發人員可以建立複雜的應用程序,無縫存取儲存在資料庫中的資料。

如何在Debian上配置MongoDB自動擴容 如何在Debian上配置MongoDB自動擴容 Apr 02, 2025 am 07:36 AM

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys

MongoDB在Debian上的高可用性如何保障 MongoDB在Debian上的高可用性如何保障 Apr 02, 2025 am 07:21 AM

本文介紹如何在Debian系統上構建高可用性的MongoDB數據庫。我們將探討多種方法,確保數據安全和服務持續運行。關鍵策略:副本集(ReplicaSet):利用副本集實現數據冗餘和自動故障轉移。當主節點出現故障時,副本集會自動選舉新的主節點,保證服務的持續可用性。數據備份與恢復:定期使用mongodump命令進行數據庫備份,並製定有效的恢復策略,以應對數據丟失風險。監控與報警:部署監控工具(如Prometheus、Grafana)實時監控MongoDB的運行狀態,並

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

Pi幣重大更新:Pi Bank要來了! Pi幣重大更新:Pi Bank要來了! Mar 03, 2025 pm 06:18 PM

PiNetwork即將推出革命性移動銀行平台PiBank! PiNetwork今日發布重大更新Elmahrosa(Face)PIMISRBank,簡稱PiBank,它將傳統銀行服務與PiNetwork加密貨幣功能完美融合,實現法幣與加密貨幣的原子交換(支持美元、歐元、印尼盾等法幣與PiCoin、USDT、USDC等加密貨幣的互換)。究竟PiBank有何魅力?讓我們一探究竟! PiBank主要功能:一站式管理銀行賬戶和加密貨幣資產。支持實時交易,並採用生物特

See all articles