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的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 NodeJs
node快速搭建后台的实现步骤
Feb 18 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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 取得瑞年与平年的天数的代码
2009/08/10 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
vuex实现简易计数器
2016/10/27 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python刷投票的脚本实现代码
2014/11/08 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
python计算无向图节点度的实例代码
2019/11/22 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
异步传递消息系统的作用
2016/05/01 面试题
《狮子和兔子》教学反思
2014/03/02 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
停课通知书
2015/04/24 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书