You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何将HTTP请求的时间/URL/方法写入json.log文件

问题描述

我想要创建一个json.log文件,记录每个HTTP请求的时间、URL和方法。目前已实现控制台打印该信息,但需要将其写入成如下指定格式的JSON文件:

{
  time: '31.10.2022:20:2',
  method: 'GET',
  url: '/api/form/contactAdmin'
},
{
  time: '31.10.2022:20:2',
  method: 'GET',
  url: '/api/form/contactAdmin'
},
{
  time: '31.10.2022:20:2',
  method: 'GET',
  url: '/api/form/contactAdmin'
}

我尝试了以下代码:

app.use(async (req, res, next) => {
  const date = new Date();
  const logObj = {
    time: `${
      date.toLocaleDateString() +
      ':' +
      date.getHours() +
      ':' +
      date.getMinutes()
    }`,
    method: req.method,
    url: req.url,
  };
  fs.appendFile(
    'log.json',
    JSON.stringify({ logObj }, null, '\t'),
    function (err) {
      if (err) {
        return console.error(err);
      }
    }
  );

  next();
});

但输出结果不符合预期,希望获得相关提示,谢谢!

问题分析与修复

你的代码存在几个关键问题导致输出不符合要求:

  1. JSON结构错误:使用JSON.stringify({ logObj }, ...)会把日志对象嵌套在logObj键下,生成{ "logObj": { ... } }的结构,而非你需要的独立对象。
  2. 分隔符缺失:直接追加字符串会导致多个日志对象之间没有逗号分隔,格式混乱。
  3. 时间格式不稳定:toLocaleDateString()的输出受系统区域设置影响,无法保证固定的DD.MM.YYYY格式。

修改后的代码如下:

const fs = require('fs');
const path = require('path');

app.use((req, res, next) => {
  // 手动格式化时间为 DD.MM.YYYY:HH:mm 格式
  const date = new Date();
  const day = String(date.getDate()).padStart(2, '0');
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const year = date.getFullYear();
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const timeStr = `${day}.${month}.${year}:${hours}:${minutes}`;

  const logObj = {
    time: timeStr,
    method: req.method,
    url: req.url
  };

  const logPath = path.join(__dirname, 'json.log');
  // 检查文件状态,判断是否需要添加逗号分隔符
  fs.stat(logPath, (err, stats) => {
    let logStr = JSON.stringify(logObj, null, '\t');
    // 若文件已存在且不为空,在新日志前添加逗号和换行
    if (!err && stats.size > 0) {
      logStr = ',\n' + logStr;
    }
    fs.appendFile(logPath, logStr, (err) => {
      if (err) console.error('写入日志失败:', err);
    });
  });

  next();
});

关键修改说明

  • 修正JSON结构:直接使用JSON.stringify(logObj, null, '\t')生成独立的日志对象,避免不必要的嵌套。
  • 统一时间格式:手动拼接日期和时间,确保输出格式固定为DD.MM.YYYY:HH:mm,不受系统区域设置影响。
  • 处理分隔符:通过fs.stat检查文件大小,当文件已有内容时,在新日志对象前添加,\n,保证多个对象之间的分隔正确。
  • 额外提示:这种格式并非标准JSON(标准JSON要求所有对象包裹在数组中),如果后续需要标准JSON格式,建议先读取文件内容、解析为数组、添加新对象后再重新写入整个文件。

内容的提问来源于stack exchange,提问作者עמית שוקרון

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:10:34