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 11 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
NodeJS实现一个聊天室功能
Nov 25 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
Parse正式发布开源PHP SDK
2014/08/11 PHP
javascript some()函数用法详解
2014/11/13 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
Python简单实现enum功能的方法
2016/04/25 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
Unix如何添加新的用户
2014/08/20 面试题
医学生实习自荐信
2013/10/01 职场文书
计算机专业毕业生推荐信
2013/11/25 职场文书
水务局局长岗位职责
2013/11/28 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
yolov5返回坐标的方法实例
2022/03/17 Python
Go语言入门exec的基本使用
2022/05/20 Golang