• Nodejs统计每秒记录日志数


    问题:线上的写日志操作非常频繁,想统计每秒写了多少行数据?假如没法送一个消息写一个日志,问题也就变成了,每秒发送多少消息了。

    日志采用log4js书写,格式如下:

    [2014-03-10 11:23:33.548] [INFO] lac -
    [2014-03-10 11:23:33.551] [INFO] lac - 
    [2014-03-10 11:23:33.563] [INFO] lac - 
    [2014-03-10 11:23:33.569] [INFO] lac - 
    [2014-03-10 11:23:33.572] [INFO] lac - 

    思路:依次读取日志的每一行,解析出时间字段,如 11:23:33 作为一个哈希表的key,没碰到依次,统计值加1. 最后根据统计次数排序。

    1)按行读取:使用readline模块,在createInterface函数中将已经创建的readStream对象传递给他即可。

    2)监听readline模块的line事件,在其中可以读到每一行数据

    3)监听close事件,当文件读取完成时会得到通知,在其中进行排序操作。

    4)完成

    代码如下:

    var readline = require('readline');
    var fs = require('fs');

      if(process.argv.length != 3)
      {
        console.log("parameter: file.log");
      return;
      }

    
    

     var logFile = process.argv[2];

    var file = fs.createReadStream(logFile);
    
    var rl = readline.createInterface({
      input: file,
      output: process.stdout,
      terminal: false
    });
    
    var counter = {};
    rl.on('line',function(line){
      var items = line.split(' ');
      if(items.length >= 2){
        console.log("%s",items[1].substring(0,8));
        var timestr = items[1].substring(0,8);
        if(counter.hasOwnProperty(timestr)){
          counter[timestr]++;
        }else{
          counter[timestr] = 1;
        }
      }
    });
    
    rl.on('close',function(){
      rl.close();
      file.close();
      
      var keys = Object.keys(counter);
    
      var arr = [];  
      for(var index in keys){
        var key = keys[index];    
        arr.push({count:counter[key],key:key});
      }
      
      ///sort by count descent
      arr.sort(function(item1,item2){
        return item2.count - item1.count;
      });
      
      for(var index in arr){
        console.log('%s %d',arr[index].key,arr[index].count);
      }
      
    });
  • 相关阅读:
    python while循环语句 结合 if else pass temp语句求触发的余数 的练习题
    IF函数多个条件判断及嵌套
    Python 字符串 加减乘除
    Python条件语句 -- if ,else ( 如果 ,那么)
    input 变量名命名规则
    Python解释器的头部编码用途
    switch留个爪,之后还需要再研究下
    面向对象+JAVA基础
    爱因斯坦台阶
    成功的拆开了SELECT里JOIN个SELECT是啥
  • 原文地址:https://www.cnblogs.com/chang290/p/3592087.html
Copyright © 2020-2023  润新知