nodejs實(shí)現(xiàn)日志讀取、日志查找及日志刷新的方法分析
本文實(shí)例講述了nodejs實(shí)現(xiàn)日志讀取、日志查找及日志刷新的方法。分享給大家供大家參考,具體如下:
知識(shí)要點(diǎn):
- JavaScript函數(shù)傳參
- JavaScript日期處理
- JavaScript字符串操作
- 前端時(shí)間插件按需定制使用
- nodejs文件操作
- nodejs按行讀取文件
下圖為日志讀取的前端呈現(xiàn),日志讀取程序?qū)⑼ㄟ^前端選擇的日志查找時(shí)間和精確度來進(jìn)行查找,也可以進(jìn)行最新日志的刷新獲取和信息反饋,比如說可以告訴用戶自從上次查看過后一共產(chǎn)生了多少條新的日志信息,此程序也做了一定的錯(cuò)誤處理
本示例使用到的時(shí)間插件可以在我的個(gè)人github 上找到
不說太多,上代碼
function readLog(date,type,operation){ //函數(shù)接受3個(gè)參數(shù),日期、精度(天時(shí)分秒)和操作(查找、刷新或者默認(rèn)) if(date){ //如果有時(shí)間參數(shù)則對(duì)時(shí)間參數(shù)進(jìn)行處理(一般日志名稱都是時(shí)間加類型) 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{ //若無時(shí)間參數(shù)則獲取當(dāng)前時(shí)間,然后精度默認(rèn) 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; //對(duì)日志結(jié)果進(jìn)行統(tǒng)計(jì) var logPath = appDirName.slice(0,-3)+'log\\'+'ivsvr_'+date+'.log'; //拼接日志文件名稱 var logStr = ''; fs.stat(logPath, function (err, stats) { //獲取對(duì)應(yīng)的日志文件狀態(tài) 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; //計(jì)數(shù)行數(shù) 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){ //進(jìn)度查找過濾 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)){ //日志結(jié)果格式化輸出呈現(xiàn) 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); //操作結(jié)束后給出信息反饋,反饋?zhàn)詣?dòng)淡出消失 } else{ $('#logTipInfo').hide(); } logReadFlag = lineCount; console.log('closed'); }); } }); }
如有疑問請(qǐng)留言討論!
希望本文所述對(duì)大家nodejs程序設(shè)計(jì)有所幫助。
相關(guān)文章
Node.js中使用Log.io在瀏覽器中實(shí)時(shí)監(jiān)控日志(等同tail -f命令)
這篇文章主要介紹了Node.js中使用Log.io在瀏覽器中實(shí)時(shí)監(jiān)控日志,Log.io等同于tail -f命令,但更強(qiáng)大,需要的朋友可以參考下2014-09-09Node.js連接postgreSQL并進(jìn)行數(shù)據(jù)操作
自從MySQL被Oracle收購(gòu)以后,PostgreSQL逐漸成為開源關(guān)系型數(shù)據(jù)庫(kù)的首選。這篇文章就給大家介紹了關(guān)于Node.js如何連接postgreSQL數(shù)據(jù)庫(kù),并進(jìn)行數(shù)據(jù)操作的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12詳解如何優(yōu)雅在webpack項(xiàng)目實(shí)現(xiàn)mock服務(wù)器
這篇文章主要為大家介紹了詳解如何優(yōu)雅在webpack項(xiàng)目實(shí)現(xiàn)mock服務(wù)器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02nodejs redis 發(fā)布訂閱機(jī)制封裝實(shí)現(xiàn)方法及實(shí)例代碼
這篇文章主要介紹了nodejs redis 發(fā)布訂閱機(jī)制封裝的相關(guān)資料,這里提供了實(shí)現(xiàn)方法,及實(shí)例代碼,具有參考價(jià)值,需要的朋友可以參考下2016-12-12