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ù)則對時(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;
//對日志結(jié)果進(jìn)行統(tǒng)計(jì)
var logPath = appDirName.slice(0,-3)+'log\\'+'ivsvr_'+date+'.log';
//拼接日志文件名稱
var logStr = '';
fs.stat(logPath, function (err, stats) {
//獲取對應(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');
});
}
});
}
如有疑問請留言討論!
希望本文所述對大家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-09
Node.js連接postgreSQL并進(jìn)行數(shù)據(jù)操作
自從MySQL被Oracle收購以后,PostgreSQL逐漸成為開源關(guān)系型數(shù)據(jù)庫的首選。這篇文章就給大家介紹了關(guān)于Node.js如何連接postgreSQL數(shù)據(jù)庫,并進(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-02
nodejs redis 發(fā)布訂閱機(jī)制封裝實(shí)現(xiàn)方法及實(shí)例代碼
這篇文章主要介紹了nodejs redis 發(fā)布訂閱機(jī)制封裝的相關(guān)資料,這里提供了實(shí)現(xiàn)方法,及實(shí)例代碼,具有參考價(jià)值,需要的朋友可以參考下2016-12-12

