ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js と MongoDB は単純なログ分析を実装します system_node.js

Node.js と MongoDB は単純なログ分析を実装します system_node.js

WBOY
WBOYオリジナル
2016-05-16 16:02:231629ブラウズ

最近のプロジェクトでは、分析を容易にするためにプロジェクト ログが JSON 形式で保存されました。以前はログをファイルに直接保存していましたが、良いタイミングでMongoDBが視界に入ってきたので、ログをMongoDBに保存しました。ログを保存するだけでは意味がありません。最も重要なのは、ログからビジネスの傾向やシステムパフォーマンスの抜け穴を発見することです。以前は、Java で作成され、Tomcat で実行される分析モジュールがありました。実装は非常に重量があり、新しいインジケーターを追加するプロセスも面倒で、NFS が原因で分析が失敗します。私はずっとそれを書き直したいと思っていて、最初は Ruby On Rails を使いたいと思っていましたが、学習して開発する時間がありませんでした (言い訳を探しています!)。杭州で開催された QCon 2011 で Node.js に再会しました。それについては以前から聞いていましたが、詳しくは勉強していませんでした。Taobao Su Qian 氏の講演を聞いた後、すぐに Node.js を使用することを思いつきました。このログ分析システムを導入します。フロントエンドも JS を使用し、サーバーも JS を使用し、データベース シェルも JS であることは考えてみれば素晴らしいことです。もちろん、最も重要なことはコード サイズが小さいことです。

1. Node.js を使用してサーバー側コードを実装します

優れたスタイルと高速なコード記述を実現するには、シンプルなフレームワークを採用することが避けられません。 Express はほとんどの機能を実装していますが、慣れるまでに時間がかかり、このプロジェクトにとっては少し重いように感じます。 Node.js の公式 Web サイトに チャット デモ があります。このコードは単純に移動され、URL の処理と JSON の返しをカプセル化します。そこで、fu.js を直接使用して、server.js を書き直しました。

コードをコピー コードは次のとおりです:

HOST = null // ローカルホスト
ポート = 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");


// ユーザーアクショントップ 10
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();
}
});
});
});
});

2. クライアント

ログ システムで最も重要なことは、視覚的な表示です。ここでは JQuery jqPlot Chart のプラグインが使用されます。まず、グラフィック表示用のコンテナとして静的 HTML ページを使用します:

コードをコピー コードは次のとおりです:



  <頭>
   
    ランデブーモニターシステム
   
   
    <スクリプト src="js/jquery.jqplot.min.js">
   
   
   
   
   
   
   
    <スクリプト src="js/plugins/jqplot.json2.min.js">
   
    <リンク rel="stylesheet" href="style/base.css">
    <スクリプト src="js/charts.js">
 
 
 

これは 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, value){
var count = 0;
value.forEach(関数(値){
カウント = value.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. マップ内の各アクションのアクセス数を 1 に設定します
2.reduce で、同じアクションへの訪問数をカウントします
3.mapReduceを実行します。クエリは「action_count」が 1 に等しくないように指定されます。つまり、統計は実行されていません。結果セットが次のように使用されることを示すために、reduce オプションが使用されます。次のreduceの入力。
4. 現在のすべてのログ レコードの「action_count」の値を 1 に設定し、統計が実行されたことを示します。これにより、まだカウントされていないレコードが更新されることになるのだろうか? ?経験豊富なヒーローが私にアドバイスをくれることを願っています!

stats.js シェルのスケジュールされた実行:

コードをコピー コードは次のとおりです:

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

これがコードのすべてです。特に神秘的なものは何もありませんが、Node.js は本当に優れたものです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。