用Node.js写一个简单的API请求日志中间件

用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 这种成熟库。但对于调试和小项目,这个方案够用了。

相关推荐
霸道流氓气质3 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
MemoleCard6 小时前
深度解析Java当中的锁机制
后端
wear工程师7 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
whyfail7 小时前
前端学 Spring Boot(2):一次点击,如何穿过整个后端?
前端·spring boot·后端
程序员cxuan9 小时前
Loop 还没玩明白,Graph Engineering 又火了。
人工智能·后端·程序员
uzong9 小时前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
程序员海军10 小时前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
不能放弃治疗10 小时前
MCP
后端
江湖十年11 小时前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json