本篇文章給大家分享的是有關(guān)使用NodeJS怎么讀取分析Nginx錯誤日志,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),涇縣企業(yè)網(wǎng)站建設(shè),涇縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,涇縣網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,涇縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。錯誤日志分析
首先我們要讀取Nginx日志,我們可以看到Nginx的錯誤日志格式一般都是這樣子,需要注意的是Nginx的錯誤日志格式是差不多的因為無法設(shè)置日志格式只能設(shè)置日志錯誤等級所以我們分析的時候很方便
這里我們用到readline
逐行讀取,簡單來說可以做
文件逐行讀?。罕热缯f進行日志分析。
自動完成:比如輸入npm,自動提示"help init install"。
命令行工具:比如npm init這種問答式的腳手架工具。 這里我們主要做日志分析其他的感興趣可以琢磨一下
實現(xiàn)方法
const readline = require('readline'); const fs = require('fs'); const path = require('path'); console.time('readline-time') const rl = readline.createInterface({ input: fs.createReadStream(path.join(__dirname, '../public/api.err.log'), { start: 0, end: Infinity }), }); let count = 0; rl.on('line', (line) => { const arr = line.split(', '); const time = arr[0].split('*')[0].split('[')[0].replace(/\//g, '-');//獲取到時間 const error = arr[0].split('*')[1].split(/\d\s/)[1];//錯誤原因 const client = arr[1].split(' ')[1];//請求的客戶端 const server = arr[2].split(' ')[1];//請求的網(wǎng)址 const url = arr[3].match(/\s\/(\S*)\s/)[0].trim()//獲取請求鏈接 const upstream = arr[4].match(/(?<=").*?(?=")/g)[0];//獲取上游 const host = arr[5].match(/(?<=").*?(?=")/g)[0];//獲取host const referrer = arr[6] ? arr[6].match(/(?<=").*?(?=")/g)[0] : '';//來源 console.log(`時間:${time}-原因:${error}-客戶端:${client}-網(wǎng)址:${server}-地址:${url}-上游:${upstream}-主機:${host}-來源:${referrer}`); count++; }); rl.on('close', () => { let size = fs.statSync(path.join(__dirname, '../public/api.err.log')).size; console.log(`讀取完畢:${count};文件位置:${size % 2 === 0}`); console.timeEnd('readline-time') });
上面代碼有幾點需要注意的是會創(chuàng)建一個文件可讀流然后由于演示所以我是直接找的本地地址如果是生產(chǎn)環(huán)境的話大家可以直接填寫服務(wù)器上的錯誤日志地址,如果沒有Nginx錯誤日志分割的話每天會產(chǎn)生很多日志,createReadStream讀取幾十M的文件還好如果讀取幾百M或者上G的容量日志這會造成性能問題,所以我們需要在每次createReadStream沒必要每次從0字節(jié)開始讀取,ceateReadStream提供了start和end
所以我們每次可以在讀取完之后記錄一下當(dāng)前文件字節(jié)大小下一次讀取文件就是可以用該文件上次的大小開始讀取
let size = fs.statSync(path.join(__dirname, '../public/api.err.log')).size;
我們可以對比一下每次從0字節(jié)開始讀取和從指定字節(jié)讀取
保存數(shù)據(jù)進行分析
這里我是用node-schedule
這個庫進行定時保存錯誤日志和linux的cron差不多,用的mongodb保存數(shù)據(jù),這里更推薦大家用elasticsearch來做日志分析
rl.on('close', async () => { let count = 0; for (let i of rlist) { count++; if (count % 500 === 0) { const res = await global.db.collection('logs').bulkWrite(rlist.slice(count, count + 500), { ordered: false, w: 1 }).catch(err => { console.error(`批量插入出錯${err}`) }); } else if (count === rlist.length - 1) { //批量插入 數(shù)據(jù) const res = await global.db.collection('logs').bulkWrite(rlist.slice(rlist - (rlist % 500), rlist.length), { ordered: false, w: 1 }); let size = fs.statSync(addres).size; size = size % 2 === 0 ? size : size + 1;//保證字節(jié)大小是偶數(shù) 不然會出現(xiàn)讀取上行內(nèi)容不完整的情況 count = 0; rlist.length = []; //更新數(shù)據(jù)庫里面文件的size global.db.collection('tasks').updateOne({ _id: addre }, { $set: { _id: addre, size, date: +new Date() } }, { upsert: true }); } } resolve(true); })
上面主要是500條保存一次,因為我用的是批量插入然后mongodb有限制一次性最多插入16M數(shù)據(jù)的限制,所以大家看自己清空決定一次性插入多少條 猶豫對readline的實現(xiàn)比較感興趣,就去翻閱了一下源碼發(fā)現(xiàn)并不是我們想的那么復(fù)雜, readline源碼 ,下面貼一下line事件的源碼,想繼續(xù)深入的同學(xué)可以看看全部的源碼
if (typeof s === 'string' && s) { var lines = s.split(/\r\n|\n|\r/); for (var i = 0, len = lines.length; i < len; i++) { if (i > 0) { this._line(); } this._insertString(lines[i]); } } ... Interface.prototype._line = function() { const line = this._addHistory(); this.clearLine(); this._onLine(line); }; ... Interface.prototype._onLine = function(line) { if (this._questionCallback) { var cb = this._questionCallback; this._questionCallback = null; this.setPrompt(this._oldPrompt); cb(line); } else { this.emit('line', line); } };
保存的數(shù)據(jù)需要進行分析比如哪個IP訪問最多哪條錯誤最多可以用聚合來進行分析貼出示例分析某個IP在某一天訪問出錯最多的原因
db.logs.aggregate( // Pipeline [ // Stage 1 { $group: { '_id': { 'client': '114.112.163.28', 'server': '$server', 'error': '$error', 'url': '$url', 'upstream': '$upstream','date':'$date' ,'msg':'$msg' } , 'date':{'$addToSet':'$date'}, count: { '$sum': 1 } } }, // Stage 2 { $match: { count: { $gte: 1 }, date: ['2019-05-10'] } }, { $sort: { count: -1 } }, ], // Options { cursor: { batchSize: 50 }, allowDiskUse: true } );
以上就是使用NodeJS怎么讀取分析Nginx錯誤日志,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文標題:使用NodeJS怎么讀取分析Nginx錯誤日志-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article20/cejpco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站制作、手機網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容