温馨提示×

如何自动化Debian JS日志分析

小樊
38
2025-12-14 09:35:29
栏目: 编程语言

Debian JS日志自动化分析实操方案

一 架构与准备

  • 明确日志来源与路径:Node.js 应用常写入 /var/log/your-js-app.logjournalctl -u ;Nginx/前端资源日志在 /var/log/nginx/;系统级日志在 /var/log/syslog。先统一日志格式(如 JSONCommon Log Format),便于后续解析与聚合。
  • 安装基础工具:确保有 Node.js/npm(用于脚本分析)、命令行工具 grep/awk/sed(快速筛选)、以及 jq(解析 JSON 日志)。
  • 日志轮转与保留:使用 logrotate 管理体积,避免磁盘被占满;对 Node 应用建议按天轮转并保留近 7–30 天。

二 方案一 轻量自动化脚本分析

  • 适用场景:单机、日志量中等、快速告警与日报。
  • 示例脚本(按行解析 JSON 并统计错误):
// analyze.js
const fs = require('fs');
const path = require('path');
const readline = require('readline');

const logFile = process.argv[2] || '/var/log/your-js-app.log';
const since = process.argv[3]; // 可选 ISO8601 时间,如 2025-12-14T00:00:00Z
const errorThreshold = parseInt(process.env.ERROR_THRESHOLD || '10', 10);

const rl = readline.createInterface({ input: fs.createReadStream(logFile), crlfDelay: Infinity });
const counts = { error: 0, warn: 0, info: 0 };
const topErrors = new Map();
let lines = 0;

rl.on('line', (line) => {
  lines++;
  let rec;
  try { rec = JSON.parse(line); } catch (e) { return; }

  // 时间过滤
  if (since && rec.time && new Date(rec.time) < new Date(since)) return;

  const level = String(rec.level || 'info').toLowerCase();
  if (counts[level] !== undefined) counts[level]++;

  if (level === 'error' && rec.msg) {
    const k = rec.msg.split(/\s+/, 5).join(' '); // 简单聚类
    topErrors.set(k, (topErrors.get(k) || 0) + 1);
  }
});

rl.on('close', () => {
  console.log(new Date().toISOString(), 'Processed lines:', lines);
  console.log('Counts:', counts);
  console.log('Top errors:');
  [...topErrors.entries()]
    .sort((a, b) => b[1] - a[1])
    .slice(0, 10)
    .forEach(([msg, n]) => console.log(`  ${n}\t${msg}`));

  if (counts.error >= errorThreshold) {
    console.error('ALERT: error count', counts.error, '>= threshold', errorThreshold);
    // TODO: 发送告警(如 curl 到 webhook、邮件等)
  }
});
  • 运行与定时:
# 安装依赖
sudo apt update && sudo apt install -y nodejs npm
sudo npm i -D chalk

# 每日 02:00 分析昨天的日志
0 2 * * * /usr/bin/node /opt/scripts/analyze.js /var/log/your-js-app.log \
  "$(date -d 'yesterday 00:00:00' -Iseconds)" >> /var/log/js-analysis.log 2>&1
  • 要点:为 Node 应用统一使用 JSON 格式 输出;脚本内做时间过滤与阈值判断,便于“异常即告警”。

三 方案二 集中化平台分析 ELK

  • 适用场景:多实例、跨服务、需要搜索/可视化/长期留存。
  • 安装与配置要点(Debian 上安装 Elasticsearch/Logstash/Kibana,版本保持一致):
# 导入 Elastic GPG 并添加 APT 源(示例为 7.x,按需调整)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update
sudo apt-get install -y elasticsearch logstash kibana

sudo systemctl enable --now elasticsearch logstash kibana
  • Logstash 配置示例(/etc/logstash/conf.d/js_logs.conf):
input {
  file {
    path => "/var/log/your-js-app.log"
    start_position => "beginning"
    sincedb_path => "/var/lib/logstash/sincedb-js"
    codec => "json"
  }
}

filter {
  # 若日志为 Common Log Format,可用 grok 解析
  # grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }

  date {
    match => [ "time", "ISO8601", "yyyy-MM-dd HH:mm:ss.SSS" ]
    target => "@timestamp"
  }

  mutate {
    remove_field => [ "host", "path" ]  # 视情况保留
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "js-logs-%{+YYYY.MM.dd}"
  }
}
  • Kibana 使用:访问 http://:5601,在 Management → Index Patterns 创建 js-logs-* 索引模式,随后在 Discover/Visualize 构建错误趋势、Top URL、响应时间分布等图表与仪表盘。

四 日志轮转与资源监控

  • 配置 logrotate(/etc/logrotate.d/your-js-app):
/var/log/your-js-app.log {
  daily
  rotate 14
  compress
  delaycompress
  missingok
  notifempty
  create 0644 node node
  sharedscripts
  postrotate
    systemctl reload your-js-app.service >/dev/null 2>&1 || true
  endscript
}
  • 资源与系统日志联动:当错误激增时,联动查看 journalctl -u /var/log/syslog、以及 top/htop/vmstat/iostat 等,定位是否为资源瓶颈引发。

五 告警与持续优化

  • 告警方式:在脚本中集成 Webhook/企业微信/钉钉/邮件;或在 Kibana 中配置 阈值告警(如 5 分钟内 ERROR > 100)。
  • 指标建议:按 小时/天 统计 ERROR/WARN 数量、TOP 错误、TOP URL/参数、P95/P99 响应时间、Node 进程 CPU/内存 峰值。
  • 持续优化:为日志增加 trace_id/request_id,提升链路追踪能力;定期回看分析规则与阈值,避免告警疲劳。

0