nohup node log2.js > log_output.log 2>&1 &

const fs = require('fs');
const request = require('request');
const schedule = require('node-schedule');
const moment = require("moment-timezone");

const logfile = 'logfile.log';
const keywords = ['Exception', 'Error', 'Warning']; // 根据需要添加或删除关键词
const dateRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}/;
const maxContentLength = 1900;

// 设置默认时区为 'Asia/Shanghai'
moment.tz.setDefault('Asia/Shanghai');

const displayLogEntry = (logEntry, logContent) => {
  const logLines = [logEntry];

  let i = logContent.indexOf(logEntry);
  while (i > 0 && !logContent[i - 1].match(dateRegex)) {
    logLines.unshift(logContent[--i]);
  }

  if (keywords.some(keyword => logLines.some(line => line.includes(keyword)))) {
    return logLines.reverse().join('\n');
  }

  return null;
};

const sendLogsToAPI = (logs) => {
  const resData = {
    "msgtype": "text",
    "text": {
      "content": "Exception监控测试:抓取到五分钟内的异常日志:\n\n" + logs,
    }
  };

  request({
    url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=17e3b586-eca2ffa84130",
    method: "POST",
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify(resData)
  }, function (error, response, body) {
    console.log('提示成功!');
  });
};

const processLogs = () => {
  const currentTime = moment();
  const currentTimestamp = currentTime.valueOf();

  const logContent = fs.readFileSync(logfile, 'utf-8').split('\n').reverse();
  const filteredLogEntries = [];
  let stopReading = false;

  for (let i = 0; i < logContent.length; i++) {
    const line = logContent[i];
    const matchedDate = line.match(dateRegex);
    if (matchedDate) {
      const logTimestamp = moment(matchedDate[0]);

      if (currentTimestamp - logTimestamp.valueOf() <= 5 * 60 * 1000) {
        const logEntry = displayLogEntry(line, logContent);
        if (logEntry) {
          filteredLogEntries.push(logEntry);
        }
      } else {
        // 如果超出指定的时间范围,则停止读取
        stopReading = true;
        break;
      }
    }
  }

  if (filteredLogEntries.length > 0) {
    const combinedLogs = filteredLogEntries.join('\n\n');
    let truncatedLogs = combinedLogs;

    if (combinedLogs.length > maxContentLength) {
      truncatedLogs = combinedLogs.substring(0, maxContentLength);
      console.log('警告:文字内容长度超过最大限制,已截断。');
    }

    sendLogsToAPI(truncatedLogs);
  }

  console.log('日志文件读取完成。');

  if (stopReading) {
    console.log('已超出时间范围,停止读取日志。');
  }
};

// 每分钟执行一次
schedule.scheduleJob('*/5 * * * *', () => {
  processLogs();
  console.log('scheduleCronstyle:' + moment().format());
});

console.log('Start successfully');

 

 

 

dockerfile部署:

FROM node:latest

WORKDIR /home/node

# 安装请求库和Vim
RUN apt-get update && \
    npm install request && \
    npm install node-schedule && \
    npm install moment-timezone && \
    apt-get install -y vim

ENTRYPOINT ["node", "log.js"]