温馨提示×

如何通过Ubuntu Node.js日志监控应用状态

小樊
47
2025-09-18 05:21:59
栏目: 编程语言

通过Ubuntu Node.js日志监控应用状态的完整流程

一、前期准备:代码层日志规范化

要实现有效的日志监控,首先需要在Node.js应用中规范日志的记录方式。推荐使用成熟的日志库(如winstonpino),避免直接使用console.log(无法满足生产级需求)。
winston为例,配置步骤如下:

  1. 安装依赖npm install winston
  2. 创建日志配置文件(如logger.js),设置日志级别、格式和传输目的地:
    const winston = require('winston'); const logger = winston.createLogger({ level: 'info', // 日志级别(从低到高:error < warn < info < debug) format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳 winston.format.json() // 结构化日志(便于后续分析) ), transports: [ new winston.transports.Console(), // 输出到控制台(开发环境) new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), // 错误日志单独存储 new winston.transports.File({ filename: 'logs/combined.log' }) // 所有日志汇总 ] }); module.exports = logger; 
  3. 在应用中使用日志
    const logger = require('./logger'); logger.info('Application started on port 3000'); // 正常启动日志 logger.error('Database connection failed:', err); // 错误日志(包含堆栈信息) 

关键点:通过日志级别区分事件严重性(如error用于故障、info用于常规状态、debug用于调试),结构化日志(JSON格式)便于后续工具解析和可视化。

二、进程管理与实时日志监控

1. 使用PM2进行进程守护与日志管理

PM2是Node.js生产环境最常用的进程管理工具,支持日志聚合实时流式查看自动重启(进程崩溃时自动恢复)等功能。

  • 安装PM2npm install pm2 -g
  • 启动应用pm2 start app.js --name "my-node-app"--name指定应用名称,便于后续管理)
  • 实时查看日志pm2 logs my-node-app(按Ctrl+C退出;添加-f参数可跟踪日志更新,如pm2 logs -f my-node-app
  • 查看日志文件:PM2会将日志保存在~/.pm2/logs/目录下(如my-node-app-error.logmy-node-app-out.log
  • 其他常用命令
    • pm2 status:查看应用运行状态(CPU、内存占用);
    • pm2 monit:实时监控应用资源使用情况(CPU、内存、日志输出);
    • pm2 restart my-node-app:重启应用(修改代码后无需手动重启)。
      PM2的优势在于轻量、易用,适合中小型项目快速实现进程管理和日志监控。

2. 使用systemd实现系统级服务监控

若需要更严格的服务管理(如系统重启后自动启动应用),可将Node.js应用配置为systemd服务。

  • 创建服务文件sudo vim /etc/systemd/system/my-node-app.service,内容如下:
    [Unit] Description=My Node.js Application After=network.target # 依赖网络服务启动 [Service] ExecStart=/usr/bin/node /path/to/your/app.js # 应用入口文件路径 Restart=always # 崩溃时自动重启 User=ubuntu # 运行用户(建议使用非root) Environment=NODE_ENV=production # 设置环境变量 WorkingDirectory=/path/to/your/app # 应用根目录 [Install] WantedBy=multi-user.target # 多用户模式下启动 
  • 启用并启动服务
    sudo systemctl daemon-reload # 重新加载systemd配置 sudo systemctl start my-node-app # 启动服务 sudo systemctl enable my-node-app # 开机自启 
  • 查看服务状态sudo systemctl status my-node-app(显示应用运行状态、日志输出)
  • 查看实时日志journalctl -u my-node-app -f-u指定服务名称,-f跟踪日志更新)
    systemd的优势在于系统级集成,适合需要高可靠性的生产环境。

三、集中式日志管理与可视化

对于分布式系统或多节点应用,需要将日志集中存储并可视化,便于统一分析和告警。常见方案有ELK Stack(Elasticsearch+Logstash+Kibana)和Prometheus+Grafana

1. ELK Stack:日志收集、存储与可视化

ELK是开源的日志管理解决方案,适合需要全文搜索复杂查询的场景。

  • 组件说明
    • Elasticsearch:分布式搜索引擎,存储和索引日志;
    • Logstash:日志收集与处理管道(解析、过滤日志);
    • Kibana:可视化工具(创建仪表板、图表)。
  • 配置步骤
    1. 安装Elasticsearch
      sudo apt install elasticsearch sudo systemctl start elasticsearch sudo systemctl enable elasticsearch 
    2. 安装Logstash
      sudo apt install logstash 
      创建Logstash配置文件(如/etc/logstash/conf.d/nodejs.conf),用于接收Node.js日志:
      input { file { path => "/path/to/your/logs/combined.log" # Node.js日志文件路径 start_position => "beginning" # 从文件开头读取(首次配置时) sincedb_path => "/dev/null" # 忽略sincedb文件(测试用) } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:logmessage}" } } # 解析日志格式 date { match => [ "timestamp", "ISO8601" ] } # 转换时间格式 } output { elasticsearch { hosts => ["localhost:9200"] } # 发送到Elasticsearch stdout { codec => rubydebug } # 控制台输出(调试用) } 
    3. 安装Kibana
      sudo apt install kibana sudo systemctl start kibana sudo systemctl enable kibana 
      访问http://<Ubuntu-IP>:5601,进入Kibana界面,创建索引模式(如nodejs-*),即可搜索和可视化日志。
  • 优势:适合复杂日志分析(如查找特定错误、统计请求耗时),但配置较复杂。

2. Prometheus+Grafana:指标监控与可视化

若更关注应用性能指标(如请求次数、响应时间、内存占用),而非日志文本,可选择Prometheus+Grafana方案。

  • 组件说明
    • Prometheus:时间序列数据库,收集和存储应用指标;
    • Grafana:可视化工具(创建仪表板,展示指标趋势);
    • Node.js客户端库prom-client(用于暴露应用指标)。
  • 配置步骤
    1. 安装Prometheus
      sudo apt install prometheus sudo systemctl start prometheus sudo systemctl enable prometheus 
      修改/etc/prometheus/prometheus.yml,添加Node.js应用的监控目标:
      scrape_configs: - job_name: 'nodejs' static_configs: - targets: ['localhost:9090'] # Node.js应用的metrics端口 
    2. 在Node.js应用中集成prom-client
      npm install prom-client 
      创建指标收集代码(如metrics.js):
      const client = require('prom-client'); const collectDefaultMetrics = client.collectDefaultMetrics; // 收集默认指标(CPU、内存) collectDefaultMetrics({ timeout: 5000 }); // 自定义指标:HTTP请求数 const httpRequestCounter = new client.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status'] }); // 自定义指标:请求延迟 const httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status'], buckets: [0.1, 0.5, 1, 2, 5] // 桶边界(秒) }); module.exports = { httpRequestCounter, httpRequestDuration }; 
      在Express应用中使用指标中间件:
      const express = require('express'); const { httpRequestCounter, httpRequestDuration } = require('./metrics'); const app = express(); app.use((req, res, next) => { const start = Date.now(); res.on('finish', () => { const duration = (Date.now() - start) / 1000; // 计算请求耗时(秒) httpRequestCounter.inc({ method: req.method, route: req.route?.path || req.path, status: res.statusCode }); httpRequestDuration.observe({ method: req.method, route: req.route?.path || req.path, status: res.statusCode }, duration); }); next(); }); app.get('/', (req, res) => res.send('Hello World')); app.listen(3000, () => console.log('Server started on port 3000')); 
    3. 安装Grafana
      sudo apt install grafana sudo systemctl start grafana-server sudo systemctl enable grafana-server 
      访问http://<Ubuntu-IP>:3000(默认账号admin,密码admin),添加Prometheus数据源(URL为http://localhost:9090),然后创建仪表板(如添加“HTTP请求数”、“请求延迟”等面板)。
  • 优势:适合实时性能监控,通过图表直观展示应用状态,支持告警规则(如请求延迟超过阈值时发送邮件)。

四、告警配置:及时发现问题

监控的目的是及时发现问题,因此需要配置告警规则。以下是常见工具的告警配置方法:

1. PM2告警

PM2内置了简单的告警功能,可通过pm2 install安装插件(如pm2-webshellpm2-logrotate),或集成第三方告警服务(如Slack、Email)。
示例:使用pm2-logrotate实现日志轮转(避免日志文件过大):

pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB pm2 set pm2-logrotate:retain 7 # 保留最近7天日志 

更复杂的告警(如错误日志触发邮件),可使用pm2-plus(PM2的商业版)或集成Zapier

2. Prometheus告警

Prometheus通过Alertmanager组件实现告警。配置步骤如下:

  1. 安装Alertmanager
    sudo apt install prometheus-alertmanager sudo systemctl start alertmanager sudo systemctl enable alertmanager 
  2. 配置Prometheus告警规则(编辑/etc/prometheus/prometheus.yml):
    rule_files: - "/etc/prometheus/alert.rules" 
    创建/etc/prometheus/alert.rules文件,定义告警规则(如请求延迟超过2秒):
    groups: - name: nodejs_alerts rules: - alert: HighRequestLatency expr: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[1m])) by (le)) > 2 for: 5m # 持续5分钟触发告警 labels: severity: warning annotations: summary: "High request latency on {{ $labels.instance }}" description: "95th percentile request latency is {{ $value }}s (threshold: 2s)" 
  3. 配置Alertmanager(编辑/etc/alertmanager/alertmanager.yml):
    route: receiver: 'email' receivers: - name: 'email' email_configs: - to: 'your-email@example.com' from: 'alertmanager@example.com' smarthost: 'smtp.example.com:587' auth_username: 'your-username' auth_password: 'your-password' 
  4. 重启服务sudo systemctl restart prometheus alertmanager
    当告警条件满足时,Prometheus会将告警发送到Alertmanager,再由Alertmanager转发到指定渠道(如邮件、Slack)。

五、最佳实践总结

  1. 日志规范化:使用winston等库,设置合理的日志级别(errorwarninfodebug),采用结构化格式(JSON),便于后续分析;
  2. 进程管理:使用PM2或systemd守护应用,确保进程崩溃时自动重启,并集中管理日志;
  3. 集中式管理:对于生产环境,建议使用ELK或Prometheus+Grafana实现日志集中存储和可视化,便于统一分析;
  4. 告警及时:配置合理的告警规则(如错误日志、高延迟),通过邮件、Slack等渠道及时通知运维人员;
  5. 定期审查:定期审查日志和告警规则,优化监控策略(如调整告警阈值),避免无效告警。

通过以上流程,可实现Ubuntu上Node.js应用状态的全面监控,及时发现并解决问题,保障应用稳定运行。

0