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

相关推荐
GoAI28 分钟前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
橙子家1 小时前
RESTful 接口:它并非标准或协议,而是一种【架构风格】
后端
小兔子2 小时前
dict.get 的默认值每次都会求值,哪怕键本来就在
后端
斯维赤2 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
肌肉娃子2 小时前
红队攻防测试报告 — wechat-e.cfd
后端
陈随易2 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
海螺_AIHCC2 小时前
SSE 流式返回中文变问号,问题不在编码
后端
panbook2 小时前
从零实现一个时序数据库(一):用 Rust、Arrow 和 Parquet 跑通写入与 SQL 查询
后端
Zan2 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
微步AICRM2 小时前
一物一码验真的并发链路设计:码段管理、四级关联与异常判定
后端·架构