Node.js dan MongoDB melaksanakan sistem analisis log ringkas_node.js

WBOY
Lepaskan: 2016-05-16 16:02:23
asal
1594 orang telah melayarinya

Dalam projek baru-baru ini, log projek telah disimpan dalam format JSON untuk analisis yang mudah. Sebelum ini, log disimpan terus dalam fail, tetapi MongoDB menceroboh pandangan saya pada masa yang tepat, jadi saya menyimpan log dalam MongoDB. Tidak ada makna untuk hanya menyimpan log Perkara yang paling penting ialah menemui arah aliran perniagaan dan kelemahan prestasi sistem daripada log. Sebelum ini terdapat modul analisis yang ditulis dalam Java dan berjalan di bawah Tomcat. Pelaksanaannya agak berat, proses menambah penunjuk baharu juga menyusahkan, dan analisis gagal disebabkan oleh NFS. Saya sentiasa mahu menulis semula, dan pada mulanya mahu menggunakan Ruby On Rails, tetapi saya tidak pernah mempunyai masa untuk belajar dan berkembang (saya sedang mencari alasan!). Saya bertemu Node.js sekali lagi di QCon 2011 di Hangzhou Walaupun saya pernah mendengarnya sebelum ini, saya tidak mempelajarinya secara mendalam Selepas mendengar ucapan Taobao Su Qian, saya segera mendapat idea untuk menggunakan Node.js. melaksanakan sistem analisis log ini. Bahagian hadapan menggunakan JS, pelayan menggunakan JS, malah cangkerang pangkalan data adalah JS Sejuk apabila anda memikirkannya—sudah tentu perkara yang paling penting ialah saiz kodnya kecil.

1. Gunakan Node.js untuk melaksanakan kod sebelah pelayan

Untuk mempunyai gaya yang baik dan penulisan kod yang pantas, adalah tidak dapat dielakkan untuk menggunakan rangka kerja yang mudah. Express melaksanakan kebanyakan fungsi, tetapi memerlukan sedikit masa untuk membiasakannya, dan nampaknya agak berat untuk projek ini. Terdapat Demo Sembang di tapak web rasmi Node.js Kod ini hanya dialihkan dan merangkum pemprosesan URL dan pengembalian JSON. Jadi saya menggunakan fu.js secara langsung dan menulis semula server.js:

Salin kod Kod adalah seperti berikut:

HOST = null; // localhost
PORT = 8001;

var fu = memerlukan("./fu"),
sys = memerlukan("util"),
url = memerlukan("url"),
mongo = memerlukan("./request_handler");

fu.listen(Nombor(process.env.PORT || PORT), HOST);

fu.get("/", fu.staticHandler("index.html"));

Bukankah ia terlalu mudah? ! Tetapi ia sememangnya berlaku, pelayan telah ditubuhkan.
Mari lihat kod request_handler.js yang mengendalikan permintaan:

Salin kod Kod adalah seperti berikut:

var mongodb = memerlukan("mongodb");
var fu = memerlukan("./fu");


// Tindakan pengguna 10 Teratas
fu.get("/userActionTop10", fungsi(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}).had(10).toArray(function(err, docs){
          jika(!err){
          var action = [];
          kiraan var = [];
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});
                                   
//Pastikan anda ingat untuk menutup sambungan pangkalan data
            conn.close();
}
});
});
});
});

2 Perkara yang paling penting tentang sistem log ialah paparan visual Pemalam JQuery

Carta jqPlot

digunakan di sini. Mula-mula gunakan halaman HTML statik sebagai bekas untuk paparan grafik:

Salin kod Kod adalah seperti berikut:



 
   
    Sistem Monitor Rendezvous
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 
 
 

几乎是jqPlot的示例中的完整拷贝,好吧,我承认我太懒了。
下面是看用来显示生成图形的chart.js:

复制代码 代码如下:

// Simpan semua fungsi lukisan carta, jika kita ingin melumpuhkan satu carta, hanya perlu
// ulas baris tolak apabila meletakkan fucntion ke dalam tatasusunan.
var cabutan = [];

/******************************* TOP 10 Mula Tindakan Pengguna ***************** *****************/
document.write('

');


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


  $.ajax({
    async:false,
    url: '/userActionTop10',
    dataType:'json',
    cache: palsu,
    kejayaan:fungsi(data){
      cuba{
        $('#userActionTop10Chart').html('');


        $.jqplot('userActionTop10Chart', [data.count], {
          tajuk: "10 Tindakan Pengguna Teratas",
          seriesDefaults:{
            pemapar:$.jqplot.BarRenderer,
            rendererOptions: {fillToZero: true},
            pointLabels: {
              tunjukkan:benar,
              ypadding:1
            }
          },
          axesDefaults:{
            tickRenderer:$.jqplot.CanvasAxisTickRenderer,
            tickOptions: {
              sudut: -30,
              Saiz fon: '12px'
            }
          },
          paksi: {
            xaxis: {
              pemapar: $.jqplot.CategoryAxisRenderer,
              kutu: data.tindakan
            },
            yaxis: {
              pad: 1.05
            }
          }
        });
      }tangkap(e){
        //alert(e.message);
      }
    }
  });
}


draws.push('drawUserActionTop10Carta');


/******************************* TOP 10 Tindakan Pengguna Tamat **************** *********************/

/*********** Carta Mula *****************/


//Letakkan fungsi lukisan carta anda di sini
//1. masukkan div untuk carta
//2. laksanakan carta lukisan fungsi
//3. tolak nama fungsi ke dalam lakaran tatasusunan


/*********** Carta Tamat *******************/

// Lukis semua carta
var drawAllCharts = function(){
  untuk(var i = 0; i < draws.length; i ){
    eval(menarik[i] "()");
  }


 //Ingat semula dirinya dalam masa 5 minit.
 window.setTimeout(drawAllCharts, 5 * 60 * 1000);
}


//
$(fungsi(){
  drawAllCharts();
});

服务器端和客户端的代码都有了,那就跑起来看效果吧:

好像忘了什么?日志的分析代码。

三、使用MongoDB 增量式MapReduce实现日志分析

在MongoDB的文档中有关于Incremental MapReduce的介绍。刚开始一直以为MongoDB实现Streaming处理,可以增自。最后发现原来是我理解有误,文档里并没有写这一点,只是说明了如何设置才能增量执行MapReduce。

为了方便,我把MapReduce使用MongoDB的JavaScript写在了单独的js文件中,然后通过crontab定时执玡。

复制代码 代码如下:

/************** Fail dilaksanakan setiap 5 minit oleh /etc/crontab.*****************/
var action_count_map = function(){
emit(this.action, {action:this.action, count:1});
}

var action_count_reduce = fungsi(kunci, nilai){
kiraan var = 0;
values.forEach(function(value){
Kira = nilai.kira;
});
Kembalikan {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);

Ideanya sangat mudah:
1. Tetapkan bilangan akses untuk setiap tindakan dalam peta kepada 1
2. Dalam mengurangkan, kira bilangan lawatan ke tindakan yang sama
3. Laksanakan mapReduce. Pertanyaan ditentukan sebagai 'action_count' tidak sama dengan 1, iaitu, statistik belum dilaksanakan; input pengurangan seterusnya.
4. Tetapkan nilai 'action_count' kepada 1 dalam semua rekod log semasa, menunjukkan bahawa statistik telah dilakukan. Saya tertanya-tanya adakah ini akan menyebabkan rekod yang masih belum dikira akan dikemas kini? ? Saya harap wira yang berpengalaman dapat memberi saya nasihat!

Pelaksanaan shell stats.js berjadual:

Salin kod Kod adalah seperti berikut:

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

Baiklah, ini semua kodnya, tiada apa-apa yang sangat misteri, tetapi Node.js adalah perkara yang bagus.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan