通过Ubuntu Node.js日志监控应用状态的完整流程
要实现有效的日志监控,首先需要在Node.js应用中规范日志的记录方式。推荐使用成熟的日志库(如winston、pino),避免直接使用console.log(无法满足生产级需求)。
以winston为例,配置步骤如下:
npm install winstonlogger.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; const logger = require('./logger'); logger.info('Application started on port 3000'); // 正常启动日志 logger.error('Database connection failed:', err); // 错误日志(包含堆栈信息) 关键点:通过日志级别区分事件严重性(如error用于故障、info用于常规状态、debug用于调试),结构化日志(JSON格式)便于后续工具解析和可视化。
PM2是Node.js生产环境最常用的进程管理工具,支持日志聚合、实时流式查看、自动重启(进程崩溃时自动恢复)等功能。
npm install pm2 -gpm2 start app.js --name "my-node-app"(--name指定应用名称,便于后续管理)pm2 logs my-node-app(按Ctrl+C退出;添加-f参数可跟踪日志更新,如pm2 logs -f my-node-app)~/.pm2/logs/目录下(如my-node-app-error.log、my-node-app-out.log)pm2 status:查看应用运行状态(CPU、内存占用);pm2 monit:实时监控应用资源使用情况(CPU、内存、日志输出);pm2 restart my-node-app:重启应用(修改代码后无需手动重启)。若需要更严格的服务管理(如系统重启后自动启动应用),可将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跟踪日志更新)对于分布式系统或多节点应用,需要将日志集中存储并可视化,便于统一分析和告警。常见方案有ELK Stack(Elasticsearch+Logstash+Kibana)和Prometheus+Grafana。
ELK是开源的日志管理解决方案,适合需要全文搜索、复杂查询的场景。
sudo apt install elasticsearch sudo systemctl start elasticsearch sudo systemctl enable elasticsearch 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 } # 控制台输出(调试用) } sudo apt install kibana sudo systemctl start kibana sudo systemctl enable kibana 访问http://<Ubuntu-IP>:5601,进入Kibana界面,创建索引模式(如nodejs-*),即可搜索和可视化日志。若更关注应用性能指标(如请求次数、响应时间、内存占用),而非日志文本,可选择Prometheus+Grafana方案。
prom-client(用于暴露应用指标)。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端口 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')); 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请求数”、“请求延迟”等面板)。监控的目的是及时发现问题,因此需要配置告警规则。以下是常见工具的告警配置方法:
PM2内置了简单的告警功能,可通过pm2 install安装插件(如pm2-webshell、pm2-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。
Prometheus通过Alertmanager组件实现告警。配置步骤如下:
sudo apt install prometheus-alertmanager sudo systemctl start alertmanager sudo systemctl enable alertmanager /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)" /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' sudo systemctl restart prometheus alertmanagerwinston等库,设置合理的日志级别(error、warn、info、debug),采用结构化格式(JSON),便于后续分析;通过以上流程,可实现Ubuntu上Node.js应用状态的全面监控,及时发现并解决问题,保障应用稳定运行。