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(); });
但输出结果不符合预期,希望获得相关提示,谢谢!
问题分析与修复
你的代码存在几个关键问题导致输出不符合要求:
- JSON结构错误:使用
JSON.stringify({ logObj }, ...)会把日志对象嵌套在logObj键下,生成{ "logObj": { ... } }的结构,而非你需要的独立对象。 - 分隔符缺失:直接追加字符串会导致多个日志对象之间没有逗号分隔,格式混乱。
- 时间格式不稳定:
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,提问作者עמית שוקרון
相关产品推荐
相关产品推荐

