温馨提示×

如何通过日志分析 Debian Node.js 应用

小樊
39
2025-12-06 11:56:42
栏目: 编程语言

Debian Node.js 应用日志分析实操指南

一 定位与收集日志

  • 常见日志位置与来源
    • 应用自定义路径:如 /var/log/nodejs//var/log/myapp/ 或项目目录下的 logs/;也可能由环境变量指定(如 LOG_PATH)。
    • 进程管理日志:使用 systemd 时,用 journalctl -u your-service-name 查看 stdout/stderr 与守护进程日志。
    • 进程管理工具:如使用 PM2,日志通常在项目目录的 logs/ 或通过 pm2 logs 查看。
  • 建议做法
    • 统一日志目录与权限,便于集中采集与轮转。
    • 在代码中显式配置日志路径与级别,避免仅依赖控制台输出。

二 命令行快速分析

  • 实时查看与检索
    • 实时跟踪:tail -f /path/to/app.log
    • 关键字过滤:grep “ERROR” /path/to/app.log
    • 字段提取与筛选(示例按空格分隔,取第1与第7字段):awk ‘{print $1,$7}’ /path/to/app.log
  • 统计与去重
    • 唯一计数:sort | uniq -c
    • 数值逆序排序:sort -n -r
  • 时间范围筛选(示例筛选包含 2025-12-06 的 ERROR)
    • awk ‘{print $1,$2,$3,$4}’ app.log | grep ‘ERROR’ | grep ‘2025-12-06’
  • 文本处理
    • 删除包含某关键字的行:sed ‘/Deprecated/d’ app.log
  • 组合示例:统计最近 1000 行中 ERROR 的 Top N
    • tail -n 1000 app.log | grep ‘ERROR’ | sort | uniq -c | sort -rn | head -n 20

三 结构化日志与性能分析

  • 使用结构化日志
    • 采用 JSON 格式(如 winston、pino、bunyan),便于按字段检索与聚合。
    • Express 中结合 morgan 输出请求日志,配合文件或控制台传输。
  • 设置合理的日志级别
    • 开发环境可用 debug/info,生产环境建议 warn/error;可通过环境变量(如 WINSTON_LEVEL、PINO_LEVEL)动态调整。
  • 从日志提取性能指标
    • 关注 响应时间、请求量、错误率 等关键指标;将日志输出到集中平台(如 ELK/Graylog/Fluentd)便于可视化与告警。
  • 示例(winston 结构化 + 按级别输出)
    • 安装:npm i winston
    • 配置:
      • const winston = require(‘winston’); const logger = winston.createLogger({ level: process.env.LOG_LEVEL || ‘info’, format: winston.format.json(), transports: [ new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }), new winston.transports.File({ filename: ‘combined.log’ }) ] });
  • 示例(morgan 记录 HTTP 请求)
    • const morgan = require(‘morgan’); app.use(morgan(‘combined’)); // 或自定义格式 )

四 日志轮转与集中化

  • 日志轮转(避免磁盘被占满)
    • 使用 logrotate 管理日志生命周期,示例配置:
      • /path/to/your.log { daily missingok rotate 7 compress notifempty create 0640 root adm }
  • 集中化与可视化
    • 小规模可用 ELK Stack(Elasticsearch/Logstash/Kibana)Graylog;多机部署建议配合 Filebeat/Fluentd 采集。
    • 监控与告警:结合 Prometheus + Grafana 对错误率、延迟等指标做可视化与阈值告警。

五 高效排查清单

  • 服务是否存活与启动参数是否正确:journalctl -u your-service-name -b
  • 最近错误与异常堆栈:tail -n 200 app.log | grep -i error
  • 某时间段的错误 Top N:awk ‘{print $1,$2,$3,$4}’ app.log | grep ‘ERROR’ | grep ‘2025-12-06’ | sort | uniq -c | sort -rn | head
  • 请求耗时分布(假设第8字段为响应时间 ms):awk ‘$8 ~ /^[0-9]+$/ {print $8}’ app.log | sort -n | tail -n 20
  • 是否存在异常重复日志:grep ‘timeout’ app.log | sort | uniq -c | sort -nr | head
  • 权限与磁盘:ls -l /var/log/myapp/;df -h;du -sh /var/log/(确认进程对日志目录有写权限且磁盘空间充足)

0