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实现获取某宝商品分类
May 28 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 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作的文本留言本的例子(五)
2006/10/09 PHP
PHP学习之数组值的操作
2011/04/17 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
jquery固定底网站底部菜单效果
2013/08/13 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python操作json数据的一个简单例子
2014/04/17 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
Python实现自动访问网页的例子
2020/02/21 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Unix如何添加新的用户
2014/08/20 面试题
自我鉴定怎么写
2014/01/12 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
bose降噪耳机音能消除人声吗
2022/04/19 数码科技