在最近的專案中,為了方便分析把專案的日誌都存成了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
}
// 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真的是個好東西。

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。