Debian Node.js 日志中如何查找慢查詢

Debian Node.js 日志中如何查找慢查詢

本文介紹如何在 debian 系統(tǒng)中使用 Node.JS 查找日志中的慢查詢。 我們將逐步講解如何高效地讀取、過濾和統(tǒng)計(jì)日志信息,最終定位性能瓶頸。

方法步驟:

  1. 日志讀取: 利用 Node.js 的 fs 模塊逐行讀取日志文件。前端可以選擇日志查找的時(shí)間范圍和精度,實(shí)現(xiàn)精準(zhǔn)定位。

  2. 日志過濾: 根據(jù)指定的時(shí)間范圍和日志類型(例如:錯(cuò)誤、警告等)篩選日志。例如,您可以設(shè)置只查找過去一小時(shí)內(nèi)的錯(cuò)誤日志。

  3. 日志統(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)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享