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实现的一个静态服务器实例
Dec 06 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 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函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
python中while循环语句用法简单实例
2015/05/07 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
python sqlite的Row对象操作示例
2019/09/11 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
python中元组的用法整理
2020/06/15 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
Python的collections模块真的很好用
2021/03/01 Python
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
酒店总经理欢迎词
2014/01/15 职场文书
捐赠仪式主持词
2014/03/19 职场文书
社区禁毒工作方案
2014/06/02 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技