在 Linux 上排查 Node.js 慢日志(慢请求 / 慢操作),通常需要自己埋点 + 日志分析,因为 Node.js 不像 MySQL 那样自带“慢日志”。下面按常见场景给你一套实用方案。
在 Express / Koa 等框架里加中间件:
Express 示例
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const cost = Date.now() - start;
if (cost > 1000) { // 超过 1 秒
console.log(`[SLOW] ${req.method} ${req.url} ${cost}ms`);
}
});
next();
});
日志示例:
[SLOW] GET /api/user 1320ms
morgan + 自定义 tokenexpress-status-monitorpino-http(推荐,性能高)const pino = require('pino');
const pinoHttp = require('pino-http');
const logger = pino();
app.use(pinoHttp({
logger,
customLogLevel: (req, res, err) => {
if (res.responseTime > 1000) return 'warn';
return 'info';
}
}));
SHOW VARIABLES LIKE 'slow_query_log';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
日志位置:
cat /var/log/mysql/slow.log
mongod --profile=1 --slowms=100
--cpu-profnode --cpu-prof app.js
结束后生成 .cpuprofile,用 Chrome DevTools 打开分析。
0x(火焰图)npm i -g 0x
0x app.js
自动生成火焰图,看哪段代码慢。
const monitor = require('event-loop-lag')(1000);
setInterval(() => {
if (monitor() > 100) {
console.log(`[LAG] event loop blocked ${monitor()}ms`);
}
}, 1000);
top -p $(pidof node)
iostat -x 1
netstat -anp | grep node
✅ HTTP 慢请求:pino-http
✅ 数据库:MySQL/Mongo 慢日志
✅ CPU:偶尔 0x 火焰图
✅ 卡顿:event-loop-lag
如果你能告诉我:
我可以直接给你一套可复制的代码配置。