如何利用JS日志监控Linux性能
利用Node.js的child_process模块执行Linux命令,异步获取CPU、内存及磁盘使用率等性能数据,通过fs.appendFile每10秒写入日志文件。该方案轻量、按需,适用于服务器性能实时监控。
在日常运维中,Linux服务器的性能监控是个绕不开的话题。你当然可以装一套Prometheus+Grafana,但有时候我们只是想要一个轻量、快速、能按需定制的方案。这时候,用Node.js写一个脚本,直接调用系统命令来抓取数据并写入日志,反而更灵活、更可控。下面就来拆解一下具体的实现思路。
前提条件:Node.js环境是必须的。如果还没安装,去官网下个LTS版本装好就行。
新建一个Ja vaScript文件,比如叫
monitor.js。在文件里写上如下代码,核心逻辑就是通过
child_process模块执行Linux命令,再异步获取输出。
const fs = require('fs');
const { exec } = require('child_process');
// 封装命令执行函数,返回Promise便于异步处理
function executeCommand(command) {
return new Promise((resolve, reject) => {
exec(command, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(stdout.trim());
}
});
});
}
// 将性能数据追加写入日志文件
function logPerformanceData(data) {
const logEntry = `${new Date().toISOString()} - ${data}\n`;
fs.appendFile('performance.log', logEntry, (err) => {
if (err) {
console.error('Error writing to log file:', err);
}
});
}
// 主监控函数,依次获取CPU、内存、磁盘信息
async function monitorPerformance() {
try {
// 获取CPU使用率(load a verage)
const cpuUsage = await executeCommand('top -bn1 | grep load | awk '{printf("%.2f"), $(NF-2)}'');
console.log(`CPU Usage: ${cpuUsage}`);
// 获取内存使用百分比
const memoryUsage = await executeCommand('free -m | grep Mem | awk '{printf("%.2f"), $3/$2 * 100}'');
console.log(`Memory Usage: ${memoryUsage}`);
// 获取磁盘使用率(根分区)
const diskUsage = await executeCommand('df -h | grep / | awk '{print $5}'');
console.log(`Disk Usage: ${diskUsage}`);
// 记录到日志
logPerformanceData(`CPU Usage: ${cpuUsage}, Memory Usage: ${memoryUsage}, Disk Usage: ${diskUsage}`);
} catch (error) {
console.error('Error monitoring performance:', error);
}
}
// 每10秒执行一次监控
setInterval(monitorPerformance, 10000);
- 在终端中运行这个脚本:
node monitor.js
脚本启动后,每10秒就会抓一次CPU负载、内存占用和磁盘使用率,并追加到performance.log里。你也可以根据实际需求调整监控间隔(把10000改成你想要的毫秒数),或者增加其他指标,比如网络I/O、进程数等。
需要说明的是,这个示例更偏向演示思路——用最简单的方式把数据拿到并落盘。生产环境里,你可能会遇到更复杂的场景:命令执行失败的处理、日志轮转、数据格式标准化、甚至直接推送到远程存储。到那时,不妨考虑结合pm2做进程守护,或者用winston这类日志库来替代简单的fs.appendFile。当然,如果监控规模真的上去了,专业工具才是正道——Prometheus+Grafana依然是扛把子。不过,手边临时用Node.js搭一个,三两下就能跑起来,不也挺香吗?


































