温馨提示×

如何通过日志监控Ubuntu上的Node.js

小樊
39
2025-11-16 06:45:01
栏目: 编程语言

Ubuntu 上 Node.js 日志监控实操指南

一 本地实时查看与过滤

  • 使用 tail -f 实时跟踪日志文件:例如 tail -f /var/log/myapp.log;配合 grep 做关键字过滤:tail -f /var/log/myapp.log | grep 'ERROR';用 watch 定时刷新末尾内容:watch -n 2 "tail -n 20 /var/log/myapp.log"
  • 多文件与高亮:安装并使用 multitail 同时查看多个日志并高亮关键字:sudo apt-get install multitail 后执行 multitail /var/log/myapp.log
  • 开发期自动重启与控制台输出:使用 nodemon 监听文件变更并重启应用:nodemon app.js(更适合开发环境)。

二 使用进程管理器 PM2 统一收集与轮转

  • 安装与启动:sudo npm install -g pm2,随后 pm2 start app.js --name my-api
  • 实时查看与过滤:pm2 logs 查看所有应用日志;pm2 logs my-api 查看指定应用;pm2 logs --raw 显示原始输出;pm2 logs | grep error 过滤关键字。
  • 日志文件与轮转:PM2 将日志写入 ~/.pm2/logs/,可通过 pm2 logrotate 配置按大小/时间切分,避免单文件过大。

三 结构化日志与系统日志集成

  • 结构化日志库:在代码中使用 WinstonBunyan 输出 JSON 或分级日志,便于检索与聚合。示例(Winston):
    • 安装:npm install winston
    • 配置:
      const winston = require('winston');
      const logger = winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        transports: [
          new winston.transports.File({ filename: 'error.log', level: 'error' }),
          new winston.transports.File({ filename: 'combined.log' }),
          new winston.transports.Console()
        ]
      });
      logger.info('Server started', { port: 3000 });
      logger.error('DB connection failed', { err: err.message });
      
  • 写入系统日志:将日志发送到 rsyslog/syslog-ng,便于与系统日志统一管理与远程转发。示例(Winston Syslog 传输):
    • 安装:npm install winston syslog-transport
    • 配置:
      const winston = require('winston');
      const SyslogTransport = require('syslog-transport');
      const logger = winston.createLogger({
        transports: [
          new SyslogTransport({
            host: 'localhost',
            app_name: 'my-node-app',
            facility: 'local0'
          })
        ]
      });
      logger.info('Hello, syslog');
      
  • 查看系统日志:使用 journalctl 检索服务日志,例如 journalctl -u my-node-app -f(按服务名实时跟踪)。

四 集中式日志平台搭建与远程转发

  • 方案对比

    方案 组件与部署 关键配置 适用场景
    ELK Elasticsearch + Logstash + Kibana Logstash 从文件采集并写入 ES;Kibana 建立索引模式与可视化 复杂查询、全文检索、可视化分析
    EFK Elasticsearch + Fluentd + Kibana Fluentd 以 tail 采集并输出到 ES;Kibana 展示 轻量采集、云原生友好
    Syslog 远程 rsyslog/syslog-ng → 远程日志服务器 将应用或系统日志通过 UDP/TCP 发送到集中日志主机 合规审计、统一落盘与转发
  • 快速上手示例

    • ELK:在 /etc/logstash/conf.d/nodejs.conf 中配置
      input { file { path => "/var/log/myapp/*.log" start_position => "beginning" } }
      output { elasticsearch { hosts => ["localhost:9200"] index => "nodejs-logs-%{+YYYY.MM.dd}" } }
      
      启动后在 http://<kibana_ip>:5601 配置索引模式查看。
    • EFK:在 /etc/td-agent/td-agent.conf 中配置
      <source>
        @type tail
        path /var/log/myapp/*.log
        pos_file /var/log/td-agent/nodejs.log.pos
        tag nodejs.log
        <parse> @type none </parse>
      </source>
      <match nodejs.log>
        @type elasticsearch
        host localhost
        port 9200
        logstash_format true
        flush_interval 10s
      </match>
      
    • Syslog 远程:在 /etc/rsyslog.conf 添加 *.* @<remote_ip>:514(UDP),或使用 syslog-ng 定义 destination 与 log 路径;重启服务后生效。

五 生产落地建议

  • 统一日志格式:在应用侧使用 Winston/Bunyan 输出结构化 JSON,包含 timestamp、level、service、trace_id 等字段,便于检索与聚合。
  • 日志轮转与保留:使用 PM2 logrotatelogrotate 按日/按大小切分并设置保留天数,避免磁盘被占满。
  • 安全与合规:集中式平台启用 认证/授权TLS;远程 Syslog 建议优先 TCP/TLS,并限制来源网段。
  • 告警与可视化:在 Kibana 配置基于关键字的告警;如需指标可结合 Prometheus + Grafana 监控请求延迟、错误率与内存占用。
  • 故障排查流程:先本地 tail -fpm2 logs 定位,再查 journalctl 与系统资源,最后在 ELK/EFK 回溯历史与上下文。

0