在Ubuntu系统上监控Node.js日志异常,需通过日志收集配置、实时监控工具、告警机制和可视化分析组合实现,以下是具体步骤:
首先确保应用能输出结构化日志(便于后续过滤和分析),推荐使用Winston(最流行的Node.js日志库):
const winston = require('winston');
const logger = winston.createLogger({
level: 'error', // 仅记录error及以上级别日志(减少噪音)
format: winston.format.json(), // 结构化日志(方便工具解析)
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), // 单独存储error日志
new winston.transports.File({ filename: 'logs/combined.log' }) // 所有日志汇总
]
});
// 示例:捕获异常并记录
try {
// 业务代码(如数据库查询、API调用)
} catch (error) {
logger.error(`Application Error: ${error.message}`, { stack: error.stack }); // 记录错误信息和堆栈
}
关键点:
level: 'error'聚焦异常日志,避免无关信息干扰;json()格式让日志更易被ELK、Prometheus等工具处理;error.log),便于快速定位问题。进程管理器可自动重启崩溃的应用,并提供日志聚合功能,推荐PM2(Node.js专用):
# 全局安装PM2
npm install pm2 -g
# 启动应用并命名(方便管理)
pm2 start app.js --name "my-node-app"
# 查看实时日志(包含error日志)
pm2 logs my-node-app
# 设置日志轮替(避免日志文件过大)
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB
pm2 set pm2-logrotate:retain 7 # 保留最近7天日志
优势:
--watch模式可监控文件变化并重启);pm2 monit命令实时监控CPU、内存等指标。通过Ubuntu命令行工具快速定位error日志:
# 实时查看error.log文件的新增内容
tail -f /path/to/your/app/logs/error.log
# 实时过滤包含"error"或"exception"的日志行(不区分大小写)
tail -f /path/to/your/app/logs/combined.log | grep -iE 'error|exception'
# 结合pm2查看特定应用的error日志
pm2 logs my-node-app --lines 100 # 查看最近100行日志
pm2 logs my-node-app | grep error # 过滤error日志
技巧:
tail -f实时跟踪日志变化;grep -iE过滤多个关键词(如error、exception、fail);pm2 logs直接查看PM2管理的应用日志,无需手动找文件。对于生产环境,建议使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog实现日志集中化:
ELK Stack配置示例(以Winston+Elasticsearch为例):
apt安装);logstash.conf):input {
file {
path => "/path/to/your/app/logs/error.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
json { source => "message" } # 解析Winston的JSON格式日志
}
output {
elasticsearch { hosts => ["localhost:9200"] } # 发送到Elasticsearch
stdout { codec => rubydebug } # 控制台输出(调试用)
}
http://localhost:5601),创建索引模式后即可搜索、可视化error日志。优势:
当出现严重异常(如5xx错误、数据库连接失败)时,及时通知运维人员,推荐以下方式:
PM2内置告警:通过pm2 plus(付费)或pm2-webshell设置邮件、Slack通知;
Prometheus+Grafana:
prom-client库,暴露错误计数指标:const client = require('prom-client');
const errorCounter = new client.Counter({
name: 'nodejs_error_total',
help: 'Total number of Node.js errors',
labelNames: ['type'] // 如'5xx'、'database'
});
// 示例:记录错误时增加计数
try {
// 业务代码
} catch (error) {
errorCounter.inc({ type: 'database' }); // 标记错误类型
logger.error(error.message);
}
prometheus.yml):scrape_configs:
- job_name: 'nodejs'
static_configs:
- targets: ['localhost:9090'] # Node.js应用的metrics端口
nodejs_error_total > 10时触发邮件通知)。第三方工具:如Uptime Kuma(开源)、Easy-Monitor(私有化部署),支持多协议监控(HTTP、TCP)和自定义告警。
通过以上步骤,可实现Ubuntu上Node.js日志异常的全面监控、快速定位和及时响应,保障应用稳定性。