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 相关文章推荐
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
yii数据库的查询方法
2015/12/28 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
原生js滑动轮播封装
2020/07/31 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
服装采购员岗位职责
2014/03/15 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
python文件名批量重命名脚本实例代码
2021/04/22 Python