通过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应用状态的全面监控,及时发现并解决问题,保障应用稳定运行。