Heim >Web-Frontend >js-Tutorial >Node.js und MongoDB implementieren eine einfache Protokollanalyse system_node.js

Node.js und MongoDB implementieren eine einfache Protokollanalyse system_node.js

WBOY
WBOYOriginal
2016-05-16 16:02:231629Durchsuche

In einem aktuellen Projekt wurden die Projektprotokolle zur einfachen Analyse im JSON-Format gespeichert. Früher wurden die Protokolle direkt in Dateien gespeichert, aber MongoDB geriet zum richtigen Zeitpunkt in mein Blickfeld, sodass ich die Protokolle in MongoDB speicherte. Es ist sinnlos, nur Protokolle zu speichern. Das Wichtigste ist, Geschäftstrends und Schwachstellen in der Systemleistung anhand von Protokollen zu erkennen. Zuvor gab es ein Analysemodul, das in Java geschrieben war und unter Tomcat lief. Die Implementierung ist ziemlich schwer, das Hinzufügen eines neuen Indikators ist ebenfalls umständlich und die Analyse schlägt aufgrund von NFS fehl. Ich wollte es schon immer neu schreiben und wollte ursprünglich Ruby On Rails verwenden, aber ich hatte nie die Zeit, es zu lernen und weiterzuentwickeln (ich suche nach Ausreden!). Ich traf Node.js wieder auf der QCon 2011 in Hangzhou, obwohl ich es nicht eingehend studiert hatte. Nachdem ich Taobao Su Qians Rede gehört hatte, kam mir sofort die Idee, Node.js zu verwenden Implementieren Sie dieses Protokollanalysesystem. Das Front-End verwendet JS, der Server verwendet JS und sogar die Datenbank-Shell ist JS. Wenn man darüber nachdenkt, ist es cool – das Wichtigste ist natürlich, dass die Codegröße klein ist.

1. Verwenden Sie Node.js, um serverseitigen Code zu implementieren

Um einen guten Stil und schnelles Code-Schreiben zu haben, ist es unvermeidlich, ein einfaches Framework zu übernehmen. Express implementiert die meisten Funktionen, es dauert jedoch einige Zeit, sich damit vertraut zu machen, und es scheint für dieses Projekt etwas schwerfällig zu sein. Auf der offiziellen Website von Node.js gibt es eine Chat-Demo. Dieser Code wird einfach verschoben und kapselt die Verarbeitung von URLs und die Rückgabe von JSON. Also habe ich fu.js direkt verwendet und server.js neu geschrieben:

Code kopieren Der Code lautet wie folgt:

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"));

Ist es nicht zu einfach? ! Es ist aber tatsächlich so, ein Server wurde eingerichtet.
Schauen wir uns den Code request_handler.js an, der Anfragen verarbeitet:

Code kopieren Der Code lautet wie folgt:

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


// TOP 10 Benutzeraktion
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 < 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});
                                   
​​​​​ //Denken Sie unbedingt daran, die Datenbankverbindung zu schließen
            conn.close();
}
});
});
});
});

2. Kunde

Das Wichtigste am Protokollsystem ist die visuelle Darstellung. Hier kommt ein Plug-in von JQuery jqPlot Chart zum Einsatz. Verwenden Sie zunächst eine statische HTML-Seite als Container für die grafische Darstellung:

Code kopieren Der Code lautet wie folgt:



 
   
    Rendezvous-Monitorsystem
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 
 
 

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

复制代码 代码如下:

// Alle Diagrammzeichnungsfunktionen speichern. Wenn wir ein Diagramm deaktivieren möchten, ist nur
erforderlich // Kommentiere die Push-Zeile, wenn du eine Funktion in das Array einfügst.
var draws = [];

/**************************** TOP 10 Benutzeraktion Start **************** ****************/
document.write('

');


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


  $.ajax({
    async:false,
    URL: '/userActionTop10',
    dataType:'json',
    Cache: falsch,
    success:function(data){
      versuche es{
        $('#userActionTop10Chart').html('');


        $.jqplot('userActionTop10Chart', [data.count], {
          Titel: „TOP 10 Benutzeraktion“,
          seriesDefaults:{
            renderer:$.jqplot.BarRenderer,
            rendererOptions: {fillToZero: true},
            Punktbezeichnungen: {
              show:true,
              ypadding:1
            }
          },
          axisDefaults:{
            tickRenderer:$.jqplot.CanvasAxisTickRenderer,
            tickOptions: {
              Winkel: -30,
              Schriftgröße: '12px'
            }
          },
          Achsen: {
            xaxis: {
              Renderer: $.jqplot.CategoryAxisRenderer,
              Häkchen: data.action
            },
            Y-Achse: {
              Pad: 1,05
            }
          }
        });
      }catch(e){
        //alert(e.message);
      }
    }
  });
}


draws.push('drawUserActionTop10Chart');


/******************************* TOP 10 Benutzeraktion Ende **************** ********************/

/*********** Diagrammstart *****************/


//Fügen Sie hier Ihre Diagrammzeichnungsfunktion ein
//1. Fügen Sie ein Div für das Diagramm ein
//2. Implementieren Sie die Funktion Zeichnungsdiagramm
//3. Schieben Sie den Funktionsnamen in die Array-Zeichnungen


/*********** Diagrammende *****************/

// Alle Diagramme zeichnen
var drawAllCharts = function(){
  for(var i = 0; i < draws.length; i ){
    eval(draws[i] "()");
  }


 //Sich selbst in 5 Minuten zurückrufen.
 window.setTimeout(drawAllCharts, 5 * 60 * 1000);
}


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

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

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

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

Die Funktion „Inkrementelles MapReduce“ von MongoDB ist die neueste Version von MongoDB apReduce.只是说明了如何设置才能增量执行MapReduce.

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

复制代码 代码如下:

/************** Die Datei wird alle 5 Minuten von /etc/crontab ausgeführt.*********************/
var action_count_map = function(){
emit(this.action, {action:this.action, count:1});
}

var action_count_reduce = Funktion(Schlüssel, Werte){
var count = 0;
Werte.forEach(Funktion(Wert){
Count = value.count;
});
Gib {action:key, count : count};
zurück }


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);

Die Idee ist ganz einfach:
1. Setzen Sie die Anzahl der Zugriffe für jede Aktion in der Karte auf 1
2. Zählen Sie beim Reduzieren die Anzahl der Besuche derselben Aktion
3. Führen Sie mapReduce aus. Die Abfrage ist so angegeben, dass „action_count“ nicht gleich 1 ist, d die Eingabe der nächsten Reduzierung.
4. Setzen Sie den Wert von „action_count“ in allen aktuellen Protokolldatensätzen auf 1, um anzuzeigen, dass die Statistiken durchgeführt wurden. Ich frage mich, ob dies dazu führt, dass Datensätze, die noch nicht gezählt wurden, aktualisiert werden? ? Ich hoffe, erfahrene Helden können mir einen Rat geben!

Geplante Ausführung der stats.js-Shell:

Code kopieren Der Code lautet wie folgt:

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

Okay, das ist der ganze Code, es gibt nichts besonders Geheimnisvolles, aber Node.js ist wirklich eine gute Sache.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn