本文介紹如何在 debian 系統(tǒng)中使用 Node.JS 查找日志中的慢查詢。 我們將逐步講解如何高效地讀取、過濾和統(tǒng)計(jì)日志信息,最終定位性能瓶頸。
方法步驟:
-
日志讀取: 利用 Node.js 的 fs 模塊逐行讀取日志文件。前端可以選擇日志查找的時(shí)間范圍和精度,實(shí)現(xiàn)精準(zhǔn)定位。
-
日志過濾: 根據(jù)指定的時(shí)間范圍和日志類型(例如:錯(cuò)誤、警告等)篩選日志。例如,您可以設(shè)置只查找過去一小時(shí)內(nèi)的錯(cuò)誤日志。
-
日志統(tǒng)計(jì): 統(tǒng)計(jì)符合條件的日志數(shù)量,并以結(jié)構(gòu)化的方式輸出結(jié)果,例如:顯示找到的日志數(shù)量及具體內(nèi)容。
Node.js 代碼示例 (改進(jìn)版):
以下代碼示例演示了如何讀取和過濾日志文件,并對(duì)代碼進(jìn)行了優(yōu)化和改進(jìn),使其更易于理解和維護(hù):
const fs = require('fs'); const readline = require('readline'); async function findSlowQueries(date, type, precision) { const logPath = `appDirName/log/ivsvr_${date}.log`; let slowQueries = []; try { const fileStats = await fs.promises.stat(logPath); if (!fileStats.isFile()) { console.log('日志文件不存在或不是文件。'); return slowQueries; } const fileStream = fs.createReadStream(logPath); const rl = readline.createInterface({ input: fileStream }); rl.on('line', (line) => { const parts = line.trim().split(' '); if (parts.length < 2) return; //忽略無效行 const timestamp = parts[0]; const message = parts.slice(1).join(' '); // 時(shí)間精度檢查 const timeRegex = /(d{4}-d{2}-d{2} d{2}:d{2}:d{2})/; const match = timestamp.match(timeRegex); if (!match) return; //忽略時(shí)間格式錯(cuò)誤的行 const logTime = match[1]; let matched = true; switch (type) { case '0': // 所有日志 break; case '1': // 按小時(shí) if (logTime.slice(0, 13) !== precision) matched = false; break; case '2': // 按分鐘 if (logTime.slice(0, 16) !== precision) matched = false; break; case '3': // 按秒 if (logTime.slice(0, 19) !== precision) matched = false; break; default: console.error('未知日志類型。'); matched = false; } if (matched && message.toLowerCase().includes('slow query')) { slowQueries.push({ timestamp: logTime, message }); } }); await new Promise((resolve) => rl.on('close', resolve)); // 等待讀取完成 } catch (error) { console.error('讀取日志文件出錯(cuò):', error); } return slowQueries; } // 示例用法: 查找2024-04-07當(dāng)天所有包含 "slow query" 的日志 findSlowQueries('2024-04-07', '0', '').then(queries => { console.log(`找到 ${queries.length} 條慢查詢?nèi)罩?`); queries.forEach(query => console.log(query)); });
改進(jìn)說明:
- 使用 async/await 簡(jiǎn)化異步操作,提高代碼可讀性。
- 使用 fs.promises 提供更簡(jiǎn)潔的異步文件操作方法。
- 添加了錯(cuò)誤處理,增強(qiáng)代碼健壯性。
- 改進(jìn)了日志匹配邏輯,使其更精確和高效。
- 使用更清晰的變量名,提高代碼可理解性。
- 直接在代碼中判斷是否包含 “slow query”,避免了復(fù)雜的正則表達(dá)式匹配。
請(qǐng)將 appDirName 替換為您的實(shí)際應(yīng)用目錄名。 這個(gè)改進(jìn)后的腳本更健壯、更易于理解和維護(hù),并且更有效地處理大型日志文件。 記住,實(shí)際應(yīng)用中,您可能需要根據(jù)您的日志格式進(jìn)行調(diào)整。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END