温馨提示×

Node.js应用在Ubuntu的日志监控技巧

小樊
42
2025-12-09 23:56:32
栏目: 编程语言

Node.js 应用在 Ubuntu 的日志监控技巧

一 日志采集与结构化

  • 使用成熟的日志库输出结构化日志,便于检索与聚合。示例(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' })
      ]
    });
    logger.info('Server started', { port: 3000 });
    logger.error('DB connect failed', { err: err.message });
    
    建议始终使用明确的日志级别(如 error、warn、info),并尽量输出结构化字段(如 requestId、userId、path)。

二 实时查看与多文件监控

  • 直接跟踪日志文件:
    tail -f /var/log/myapp.log
    
  • 同时查看多个日志并高亮:
    sudo apt-get install multitail
    multitail /var/log/myapp.log /var/log/myapp-error.log
    
  • 使用进程管理器 PM2 聚合与查看日志:
    sudo npm install -g pm2
    pm2 start app.js --name my-app
    pm2 logs my-app
    
    以上方式适合本地排查与临时观测,便于快速定位问题。

三 日志轮转与保留策略

  • 使用 logrotate 避免日志无限增长(创建文件 /etc/logrotate.d/nodejs):
    /path/to/your/nodejs/app/logs/*.log {
      daily
      missingok
      rotate 7
      compress
      notifempty
      create 0640 root adm
    }
    
    含义:按天轮转、保留最近 7 天、压缩旧日志、自动创建新文件并设置权限。若使用 PM2,也可启用内置日志轮转(pm2 logrotate)。

四 集中化与系统日志集成

  • 输出到系统日志(journald),统一由 journalctl 查询:
    sudo npm install winston winston-syslog
    
    配置示例:
    const winston = require('winston');
    const SyslogTransport = require('winston-syslog').SyslogTransport;
    
    const logger = winston.createLogger({
      transports: [
        new SyslogTransport({ host: 'localhost', app_name: 'my-node-app', facility: 'local0' })
      ]
    });
    logger.info('Hello, journald');
    
    查询:
    journalctl -u my-node-app -f
    
  • 集中式日志平台:小规模可用 ELK Stack(Elasticsearch、Logstash、Kibana)EFK(Elasticsearch、Fluentd、Kibana);也可对接 Graylog、Splunk 或云日志服务(如 Datadog、New Relic、Loggly)实现跨主机聚合、检索与告警。

五 告警与可视化实践

  • 指标与可视化:在 Node.js 中引入 prom-client 暴露指标,配合 Prometheus 抓取、Grafana 构建仪表盘,监控 请求耗时、错误率、内存/CPU 等;日志侧建议对 ERROR 关键字设置实时告警(如通过 journald 或集中式平台的告警规则)。
  • 快速检索示例:
    # 过滤错误日志
    grep -i 'ERROR' /var/log/myapp.log
    
    # 统计每分钟错误数(按日志时间字段)
    grep -i 'ERROR' /var/log/myapp.log | awk -F: '{print $1":"$2}' | sort | uniq -c
    
    通过结构化日志与时间字段,可快速构建错误趋势与异常定位面板。

0