用Node.js写一个简单的API请求日志中间件
最近在优化后端服务,需要记录每次API请求的耗时和状态码,写了一个轻量的中间件,分享出来。
思路
在 Express/Koa 的请求生命周期中插入一个中间件,记录:
- 请求方法和路径
- 响应状态码
- 请求耗时(毫秒)
- 请求时间戳
代码
javascript
function requestLogger(req, res, next) {
const start = Date.now();
const { method, path } = req;
res.on('finish', () => {
const duration = Date.now() - start;
const status = res.statusCode;
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] ${method} ${path} ${status} ${duration}ms`);
});
next();
}
使用方式
Express 中直接挂载:
javascript
const express = require('express');
const app = express();
app.use(requestLogger);
app.get('/api/test', (req, res) => {
res.json({ ok: true });
});
app.listen(3000);
访问 localhost:3000/api/test,控制台输出:
bash
[2026-07-01T03:00:00.000Z] GET /api/test 200 3ms
进阶:写入文件
如果需要持久化,可以用 fs.appendFile 写入日志文件:
javascript
const fs = require('fs');
function fileLogger(req, res, next) {
const start = Date.now();
const { method, path } = req;
res.on('finish', () => {
const duration = Date.now() - start;
const status = res.statusCode;
const timestamp = new Date().toISOString();
const line = `[${timestamp}] ${method} ${path} ${status} ${duration}ms\n`;
fs.appendFile('access.log', line, (err) => {
if (err) console.error('日志写入失败', err);
});
});
next();
}
小结
这个中间件很轻量,生产环境建议用 winston 或 pino 这种成熟库。但对于调试和小项目,这个方案够用了。