亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

NodeJS讀取分析Nginx錯誤日志的方法

2019-11-19 11:34:33
字體:
來源:轉載
供稿:網友

網上很少看到有用NodeJS運維系列文章,后續我會更新一些NodeJS運維相關的內容又或者說讓我們更加的深入了解一些服務器的知識以及自動化運維方面的基礎知識 為什么要做錯誤日志分析,因為網上這方面的工具不多我找到一個goaccess但是都是分析成功日志以及用戶訪問趨勢,找了半天沒找著自己想要的索性就自己利用Node造一個

錯誤日志分析

首先我們要讀取Nginx日志,我們可以看到Nginx的錯誤日志格式一般都是這樣子,需要注意的是Nginx的錯誤日志格式是差不多的因為無法設置日志格式只能設置日志錯誤等級所以我們分析的時候很方便

 這里我們用到readline

逐行讀取,簡單來說可以做

  • 文件逐行讀?。罕热缯f進行日志分析。
  • 自動完成:比如輸入npm,自動提示"help init install"。
  • 命令行工具:比如npm init這種問答式的腳手架工具。 這里我們主要做日志分析其他的感興趣可以琢磨一下

實現方法

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];//請求的網址 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}-網址:${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')});

上面代碼有幾點需要注意的是會創建一個文件可讀流然后由于演示所以我是直接找的本地地址如果是生產環境的話大家可以直接填寫服務器上的錯誤日志地址,如果沒有Nginx錯誤日志分割的話每天會產生很多日志,createReadStream讀取幾十M的文件還好如果讀取幾百M或者上G的容量日志這會造成性能問題,所以我們需要在每次createReadStream沒必要每次從0字節開始讀取,ceateReadStream提供了start和end

 

所以我們每次可以在讀取完之后記錄一下當前文件字節大小下一次讀取文件就是可以用該文件上次的大小開始讀取

let size = fs.statSync(path.join(__dirname, '../public/api.err.log')).size;

我們可以對比一下每次從0字節開始讀取和從指定字節讀取

保存數據進行分析

這里我是用node-schedule這個庫進行定時保存錯誤日志和linux的cron差不多,用的mongodb保存數據,這里更推薦大家用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) {      //批量插入 數據       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;//保證字節大小是偶數 不然會出現讀取上行內容不完整的情況       count = 0;       rlist.length = [];       //更新數據庫里面文件的size       global.db.collection('tasks').updateOne({ _id: addre }, { $set: { _id: addre, size, date: +new Date() } }, { upsert: true });       }     }     resolve(true);    })

上面主要是500條保存一次,因為我用的是批量插入然后mongodb有限制一次性最多插入16M數據的限制,所以大家看自己清空決定一次性插入多少條 猶豫對readline的實現比較感興趣,就去翻閱了一下源碼發現并不是我們想的那么復雜, readline源碼 ,下面貼一下line事件的源碼,想繼續深入的同學可以看看全部的源碼

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); }};

保存的數據需要進行分析比如哪個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錯誤日志的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品视频在线播放| 97视频免费观看| 狠狠躁夜夜躁人人爽天天天天97| 欧美大片大片在线播放| 国产一区二区三区在线看| 欧美一区二区.| 亚洲乱码一区二区| 久久精品国产成人| 在线精品视频视频中文字幕| 粗暴蹂躏中文一区二区三区| 最新69国产成人精品视频免费| 综合136福利视频在线| 精品国产91久久久| 亚洲有声小说3d| 欧美日韩xxxxx| 日韩动漫免费观看电视剧高清| 欧美一级成年大片在线观看| 亚洲无av在线中文字幕| 色老头一区二区三区在线观看| 成人av在线天堂| 亚洲www在线观看| 亚洲久久久久久久久久| 最近日韩中文字幕中文| www欧美xxxx| 亚洲国产精品一区二区三区| 国外成人在线视频| 最近2019中文免费高清视频观看www99| 欧美性少妇18aaaa视频| 九色精品免费永久在线| 91精品国产91久久久久福利| 在线播放国产一区中文字幕剧情欧美| 欧美国产日韩精品| 国产成人精品在线播放| 欧美国产在线视频| 久久久免费av| 91色视频在线导航| 国产在线精品自拍| 人人做人人澡人人爽欧美| 久久大大胆人体| 亚洲欧美日韩中文在线制服| 精品国产91久久久久久| 亚洲bt欧美bt日本bt| 国产一区二区三区四区福利| 97精品视频在线播放| 亚洲国产美女精品久久久久∴| 亚洲成人久久电影| 国产精品一区久久| 久久综合伊人77777蜜臀| 欧美日韩性视频在线| 亚洲高清色综合| 亚洲图片在区色| 97在线视频国产| 一区二区亚洲欧洲国产日韩| 91精品久久久久久久久| 亚洲免费成人av电影| 欧洲日本亚洲国产区| 国产精品一区二区三区在线播放| 国外日韩电影在线观看| 一区二区三区亚洲| 久久久久久久久久久国产| 在线激情影院一区| 欧美丰满老妇厨房牲生活| 亚洲成人av在线| 中国人与牲禽动交精品| 茄子视频成人在线| 国产精品草莓在线免费观看| 亚洲视频专区在线| 欧美成人四级hd版| 日韩精品在线第一页| 欧美激情区在线播放| 久久亚洲精品一区| 欧美成人一二三| 亚洲色图17p| 韩国视频理论视频久久| 欧美理论片在线观看| 精品福利视频导航| 亚洲最大的av网站| 九九久久精品一区| 国产欧美精品一区二区三区-老狼| 亚洲va国产va天堂va久久| 色综合视频一区中文字幕| 亚洲大胆美女视频| 精品亚洲国产成av人片传媒| 国产主播在线一区| 97在线精品视频| 国产精品久久久久福利| 青青久久av北条麻妃海外网| 欧美一级视频一区二区| 国产精品日日做人人爱| 午夜精品久久久99热福利| 亚洲一区二区三区四区在线播放| 精品国产鲁一鲁一区二区张丽| 亚洲视频自拍偷拍| 亚洲综合色激情五月| 亚洲乱码国产乱码精品精天堂| 日韩成人久久久| 久久91亚洲精品中文字幕奶水| 国产欧美日韩免费看aⅴ视频| 91久久久久久久一区二区| 久久成人国产精品| 国内精品国产三级国产在线专| 青青草原一区二区| 97色在线观看免费视频| 欧美激情欧美狂野欧美精品| 久久亚洲影音av资源网| 精品久久久久久国产| 成人啪啪免费看| 国产精品福利片| 亚洲男人av在线| 91亚洲精华国产精华| 国产91亚洲精品| 中文字幕欧美精品在线| 亚洲午夜精品久久久久久性色| 日韩有码片在线观看| 91美女高潮出水| 亚洲人永久免费| 久久精品这里热有精品| 欧美成人在线网站| 久久久久久久电影一区| 上原亚衣av一区二区三区| 欧美夫妻性生活视频| 欧美精品在线网站| 欧美尤物巨大精品爽| 日本最新高清不卡中文字幕| 亚洲成人三级在线| 亚洲综合日韩中文字幕v在线| 韩日精品中文字幕| 久久天天躁日日躁| 国产精品最新在线观看| 欧美日韩视频免费播放| 久久精品国产精品| 国产精品久久久久久一区二区| 国产亚洲a∨片在线观看| 国产成人精品一区| 国产国产精品人在线视| 亚洲欧美日韩一区二区在线| 中文精品99久久国产香蕉| 中文字幕亚洲色图| 久久资源免费视频| 成人免费自拍视频| 97人人模人人爽人人喊中文字| 欧美高清视频一区二区| 欧美另类极品videosbest最新版本| 欧美黑人性生活视频| 国产亚洲欧美日韩美女| 亚洲精品国偷自产在线99热| 尤物99国产成人精品视频| 欧美精品videosex极品1| 国产91色在线| 国产精品白丝av嫩草影院| 欧美精品福利视频| 中国人与牲禽动交精品| 久久97精品久久久久久久不卡| 国产一区二区美女视频| 日韩经典一区二区三区| 91免费电影网站| 亚洲欧美在线磁力| 一本色道久久88综合亚洲精品ⅰ| 91成人福利在线| 日韩成人小视频| 亚洲影院在线看| 国产日本欧美在线观看| 国产成人精品免费久久久久| 亚洲国产精品va在看黑人|