debian

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

小樊
44
2025-04-07 12:35:21
栏目: 编程语言

在Debian系统上使用Node.js时,查找日志中的慢查询可以通过以下步骤实现:

  1. 日志读取:使用Node.js的文件系统(fs)模块按行读取日志文件。可以通过前端选择的日志查找时间和精确度来进行查找。
  2. 日志过滤:根据指定的时间范围和日志类型(如错误、警告等)过滤日志。例如,可以设置时间范围为过去的一小时,并且只查找错误类型的日志。
  3. 日志统计:统计符合条件的日志数量,并格式化输出结果。例如,可以输出查找到的日志数量和具体的日志内容。

以下是一个简单的Node.js脚本示例,用于读取和过滤日志文件:

const fs = require('fs');
const readline = require('readline');

function readLog(date, type, operation) {
  const logPath = `appDirName/log/ivsvr_${date}.log`;
  const logStr = '';

  fs.stat(logPath, function (err, stats) {
    if (err) {
      console.log('无日志信息可供查看');
      return;
    }

    let lineCount = 0;
    const fReadName = logPath;
    const fRead = fs.createReadStream(fReadName);
    const objReadline = readline.createInterface({ input: fRead });

    objReadline.on('line', (line) => {
      const itemStr = line.trim();
      const time = itemStr.slice(0, 19);
      const content = itemStr.substr(20);

      if (!time || !content) return;

      lineCount++;

      switch (type) {
        case '0': // 查找所有日志
          break;
        case '1': // 按小时过滤
          if (time.slice(0, 2) === hour) {
            matched = true;
          } else {
            matched = false;
          }
          break;
        case '2': // 按分钟过滤
          if (time.slice(0, 5) === minute) {
            matched = true;
          } else {
            matched = false;
          }
          break;
        case '3': // 按秒过滤
          if (time.slice(0, 8) === second) {
            matched = true;
          } else {
            matched = false;
          }
          break;
        default:
          console.log('unknown type!');
          break;
      }

      if (matched && lineCount <= logReadFlag) {
        const itemArr = itemStr.split(' ');
        const logDate = itemArr[0];
        const logTime = itemArr[1];
        const result = itemArr[2];

        if (result === 'err') {
          const operation = itemArr[4];
          result = `失败: ${itemArr[5]} (${itemArr[6] || ''})`;
        } else {
          const operation = itemArr[4] + ' ' + itemArr[5](itemArr[6] || '');
          result = '成功';
        }

        logStr += `<tr><td>${logTime}</td><td>${operation}</td><td>${result}</td></tr>`;
      }
    });

    objReadline.on('close', () => {
      if (lineCount <= logReadFlag && logStr) {
        console.log(logStr);
      } else if (logReadFlag === 0 && logStr) {
        console.log('刷新成功,更新了' + lineCount + '条日志!');
      } else {
        console.log('刷新成功,无日志更新!');
      }
    });
  });
}

// 示例调用
readLog(new Date().toISOString().slice(0, 10), '1', 'search');

请注意,上述代码仅为示例,实际应用中可能需要根据具体的日志格式和需求进行调整。此外,为了提高性能,可以考虑使用流式处理和异步操作来处理大型日志文件。

0
看了该问题的人还看了