温馨提示×

nodejs linux日志怎么解析

小樊
45
2026-09-02 13:04:06
栏目: 编程语言

在 Linux 下用 Node.js 解析日志,通常取决于日志格式(plain text、JSON、CSV、Nginx/Apache 格式等)。下面按常见场景给你一套实用方案。


一、常见日志类型

  1. 纯文本日志(自定义格式)
  2. JSON 日志(推荐)
  3. Nginx / Apache 访问日志
  4. 系统日志(/var/log/messages、syslog)

二、基础读取方式(Node.js)

1. 小文件:直接读

const fs = require('fs');

const logs = fs.readFileSync('/var/log/app.log', 'utf8')
  .split('\n')
  .filter(Boolean);

logs.forEach(line => {
  console.log(parseLine(line));
});

2. 大文件:流式读取(推荐)

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

const rl = readline.createInterface({
  input: fs.createReadStream('/var/log/app.log'),
  crlfDelay: Infinity
});

rl.on('line', (line) => {
  parseLine(line);
});

✅ 适合 GB 级日志文件


三、日志解析示例

1️⃣ 解析自定义文本日志

示例日志:

2024-01-12 10:22:33 [ERROR] user 123 failed login
function parseLine(line) {
  const regex = /^(\S+) (\S+) \[(\w+)\] (.+)$/;
  const match = line.match(regex);
  if (!match) return null;

  return {
    date: match[1],
    time: match[2],
    level: match[3],
    message: match[4]
  };
}

2️⃣ 解析 JSON 日志(最推荐)

日志示例:

{"time":"2024-01-12T10:22:33Z","level":"error","msg":"login failed","uid":123}
function parseLine(line) {
  try {
    return JSON.parse(line);
  } catch {
    return null;
  }
}

✅ 结构化、易分析、易扩展


3️⃣ 解析 Nginx 访问日志

默认格式:

127.0.0.1 - - [12/Jan/2024:10:22:33 +0000] "GET /api HTTP/1.1" 200 1234
const regex = /^(\S+) \S+ \S+ \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d+) (\d+)/;

function parseNginx(line) {
  const m = line.match(regex);
  if (!m) return null;

  return {
    ip: m[1],
    time: m[2],
    method: m[3],
    url: m[4],
    status: m[6],
    size: m[7]
  };
}

四、实战:统计错误日志

const errorCount = {};

rl.on('line', (line) => {
  const log = parseLine(line);
  if (log?.level === 'ERROR') {
    errorCount[log.message] = (errorCount[log.message] || 0) + 1;
  }
});

rl.on('close', () => {
  console.log(errorCount);
});

五、进阶方案(生产级)

✅ 使用成熟库

  • winston / pino(日志生成)
  • logrotate(Linux 日志切割)
  • glob + stream(多文件)
  • elastic + node(日志搜索)

✅ 多文件解析

const glob = require('glob');

glob('/var/log/app/*.log', (err, files) => {
  files.forEach(file => {
    // 流式解析
  });
});

六、最佳实践建议

✅ 日志尽量用 JSON ✅ 使用 stream 防止内存爆炸
✅ 配合 logrotate
✅ 错误日志单独文件


如果你愿意,可以:

  • 贴一段真实日志示例
  • 说明是 Nginx / Node / 系统日志
  • 告诉我你想统计什么

我可以直接帮你写可用的解析脚本。

0