Ubuntu系统下监控Node.js日志中资源消耗的方法
PM2是Node.js生态中最流行的进程管理工具之一,可实时监控应用的CPU、内存、内存占用率等资源消耗,并关联日志输出。
npm install pm2 -g全局安装,启动应用时使用pm2 start app.js --name "my-app"(--name指定应用名称)。pm2 monit进入监控界面,可查看所有进程的CPU、内存实时使用率,以及日志的实时滚动输出(默认显示stderr和stdout)。pm2 logs my-app查看应用日志,结合grep过滤资源相关关键词(如ERROR、Memory Usage),例如pm2 logs my-app | grep "Memory"可提取内存相关的日志条目。通过process和os模块获取系统资源数据,使用winston等日志库将资源消耗写入日志文件,便于后续分析。
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'resource.log' }) // 资源日志单独存储
]
});
setInterval(() => {
const memory = process.memoryUsage(); // 内存使用情况(RSS、堆内存等)
const cpu = process.cpuUsage(); // CPU时间(用户态/内核态)
const loadAvg = os.loadavg(); // 系统负载(1/5/15分钟平均负载)
logger.info('Resource Usage', {
memory: {
rss: `${(memory.rss / 1024 / 1024).toFixed(2)} MB`, // 常驻内存集
heapTotal: `${(memory.heapTotal / 1024 / 1024).toFixed(2)} MB`,
heapUsed: `${(memory.heapUsed / 1024 / 1024).toFixed(2)} MB`
},
cpu: {
user: `${(cpu.user / 1000000).toFixed(2)} ms`, // 用户态CPU时间
system: `${(cpu.system / 1000000).toFixed(2)} ms` // 内核态CPU时间
},
systemLoad: loadAvg // 系统负载
});
}, 5000); // 每5秒记录一次
resource.log,方便通过grep、awk等工具分析趋势(如awk '/Memory Usage/{print $3}' resource.log | sort -nr找出内存峰值)。Ubuntu自带的系统监控工具可直接查看Node.js进程的资源占用,辅助定位日志中的资源瓶颈。
htop(需安装:sudo apt install htop),通过F3搜索Node.js进程,实时查看CPU、内存、线程等使用情况;top命令则通过Shift+M按内存排序,快速定位高内存进程。vmstat 1(每秒刷新),查看系统整体的CPU(us用户态、sy内核态)、内存(free空闲内存)、IO(io磁盘读写)等指标,判断系统级资源瓶颈。iostat -x 1,查看磁盘IO的详细指标(如%util磁盘利用率),识别磁盘IO导致的资源消耗问题。APM(应用性能管理)工具可自动采集Node.js应用的资源消耗数据,并与日志关联,提供可视化的性能洞察。
prom-client库,暴露/metrics端点(收集内存、CPU、请求延迟等指标);/metrics数据,Grafana通过Prometheus数据源创建仪表板,可视化资源消耗趋势(如内存占用随时间的变化、CPU使用率的峰值)。通过日志分析工具识别资源消耗异常,并配置告警及时通知运维人员。
grok解析资源消耗日志(如提取Memory Usage: xxx MB中的数值),设置阈值告警。