nodejs实现日志读取、日志查找及日志刷新的方法分析


Posted in NodeJs onMay 20, 2019

本文实例讲述了nodejs实现日志读取、日志查找及日志刷新的方法。分享给大家供大家参考,具体如下:

知识要点:

  • JavaScript函数传参
  • JavaScript日期处理
  • JavaScript字符串操作
  • 前端时间插件按需定制使用
  • nodejs文件操作
  • nodejs按行读取文件

下图为日志读取的前端呈现,日志读取程序将通过前端选择的日志查找时间和精确度来进行查找,也可以进行最新日志的刷新获取和信息反馈,比如说可以告诉用户自从上次查看过后一共产生了多少条新的日志信息,此程序也做了一定的错误处理

本示例使用到的时间插件可以在我的个人github 上找到

nodejs实现日志读取、日志查找及日志刷新的方法分析

不说太多,上代码

function readLog(date,type,operation){
//函数接受3个参数,日期、精度(天时分秒)和操作(查找、刷新或者默认)
    if(date){
    //如果有时间参数则对时间参数进行处理(一般日志名称都是时间加类型)
      var dataStr = arguments[0];
      var date = dataStr.slice(0,10);
      var hour = dataStr.slice(11,13);
      var minute = dataStr.slice(11,16);
      var second =dataStr.slice(11,19);
      var type = arguments[1];
      //获取精度
    }else{
    //若无时间参数则获取当前时间,然后精度默认
      var date = new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'').slice(0,10);
      var type=null;
    }
    var op = arguments[2];
    var countResult = 0;
    //对日志结果进行统计
    var logPath = appDirName.slice(0,-3)+'log\\'+'ivsvr_'+date+'.log';
    //拼接日志文件名称
    var logStr = '';
    fs.stat(logPath, function (err, stats) {
    //获取对应的日志文件状态
    if(err){
    //日志不存在或者异常处理信息
      $('#logTipInfo tr td').html('无日志信息可供查看');
      console.log(err);
    }else{
      var lineCount = 0;
      var readline = require('readline');
      var fReadName = logPath;
      var fRead = fs.createReadStream(fReadName);
      var objReadline = readline.createInterface({
        input: fRead,
      });
      //按行读取日志
      objReadline.on('line', (line)=>{
        var itemStr = $.trim(line);
        var time = itemStr.slice(0,19);
        var content = itemStr.substr(20);
        if(!time || !content){return;}
        ++ lineCount;
        //计数行数
        var matched = true;
        var itemStr = $.trim(line);
        var itemArr = itemStr.split(' ');
        var logDate = itemArr[0];
        var logTime = itemArr[1];
        var time = logDate+' '+logTime;
        switch(type){
        //进度查找过滤
          case '0':
          case null:
            matched = true;
            break;
          case '1':
            var timeSplit = logTime.slice(0,2);
            if(timeSplit == hour){
              matched = true;
              break;
            }
            matched = false;
            break;
          case '2':
            var timeSplit = logTime.slice(0,5);
            if(timeSplit == minute){
              matched = true;
              break;
            }
            matched = false;
            break;
          case '3':
            var timeSplit = logTime.slice(0,8);
            if(timeSplit == second){
              matched = true;
              break;
            }
            matched = false;
            break;
          default:
            console.log('unkonw type!');
            break;
        }
        if(matched === true &&(lineCount>logReadFlag)){
        //日志结果格式化输出呈现
          countResult ++;
          var result = itemArr[2];
          if(result == 'err'){
            var operation = itemArr[4];
            result = '失败:'+itemArr[5]+' '+(itemArr[6]?itemArr[6]:'');
          }else{
            var operation = itemArr[4]+' '+itemArr[5]+(itemArr[6]?itemArr[6]:'');
            result = '成功';
          }
          logStr += '<tr><td>'+time+'</td><td>'+operation+'</td><td>'+result+'</td></tr>'
        }
        logStr += '<tr><td>'+time+'</td><td>'+content+'</td></tr>'
      });
      objReadline.on('close', ()=>{
        if(logReadFlag == 0 && (logStr == '')){
          var info = '无日志信息可供查看';
        }
        if(logReadFlag >0 && (logStr != '')){
          var newLogNum = lineCount - logReadFlag;
          var info = '刷新成功,更新'+newLogNum+'条日志!';
          $('#logInfoTable').prepend(logStr);
        }else if(logReadFlag >0 && (logStr == '')){
          var info = '刷新成功,无日志更新!';
        }else{
          $('#logInfoTable').html(logStr);
        }
        if(op == 'search'){
          var info = '查找到'+countResult+'条日志';
        }
        $('#logTipInfo tr td').html(info);
        if((op == 'search' || op == 'refresh') &&(logReadFlag != 0 || newLogNum >0 || countResult >0)){
          setTimeout(function() {$('#logTipInfo').fadeOut(567);}, 2000);
          //操作结束后给出信息反馈,反馈自动淡出消失
        }
        else{
          $('#logTipInfo').hide();
        }
        logReadFlag = lineCount;
        console.log('closed');
      });
    }
  });
}

如有疑问请留言讨论!

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
浅谈Node的内存泄露问题
May 06 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 #NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 #NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 #NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 #NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 #NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 #NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 #NodeJs
You might like
学习php开源项目的源码指南
2014/12/21 PHP
php生成rss类用法实例
2015/04/14 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
ParseInt函数参数设置介绍
2014/01/02 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
Python itertools模块详解
2015/05/09 Python
六个窍门助你提高Python运行效率
2015/06/09 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
python函数形参用法实例分析
2015/08/04 Python
python实现简单多人聊天室
2018/12/11 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
python实现杨氏矩阵查找
2019/03/02 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
网上书店创业计划书
2014/01/12 职场文书
优秀干部获奖感言
2014/01/31 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
股东合作协议书
2014/09/12 职场文书
python unittest单元测试的步骤分析
2021/08/02 Python