Node.js中能否判断writeFile调用时是否创建了新文件?
方案1:新建文件时触发清理(优先推荐)
完全可以通过writeFile的回调或异步等待逻辑实现,不需要额外编写独立的定时清理脚本,这种方案更适配你的高负载场景,仅在每小时新建文件时触发一次清理,资源占用极低。
你可以直接在新建日志文件的逻辑结束后,同步插入旧日志清理流程,参考示例代码:
const fs = require('fs/promises'); const path = require('path'); // 自定义配置:日志存储目录、最大保留日志数量 const LOG_STORAGE_PATH = path.resolve(__dirname, './logs'); const MAX_RETAINED_LOGS = 24; // 新建日志文件的方法 async function generateHourlyLog() { const logFileName = `${Math.floor(Date.now() / 3600000) * 3600000}.log`; const fullLogPath = path.join(LOG_STORAGE_PATH, logFileName); // 执行新文件创建 await fs.writeFile(fullLogPath, '【日志头】小时级日志启动\n', { flag: 'wx' }); // 新文件创建完成后直接触发清理逻辑,可丢到setImmediate避免阻塞主流程 setImmediate(cleanExpiredLogs); return fullLogPath; } // 旧日志清理逻辑 async function cleanExpiredLogs() { const allFiles = await fs.readdir(LOG_STORAGE_PATH); // 仅筛选后缀为.log的日志文件 const logFiles = allFiles.filter(item => item.endsWith('.log')); // 日志数量未超过阈值则不执行删除 if (logFiles.length <= MAX_RETAINED_LOGS) return; // 按文件时间戳从小到大排序,取最旧的超出部分删除 const sortedLogs = logFiles.sort((a, b) => { return Number(a.slice(0, -4)) - Number(b.slice(0, -4)); }); const toDeleteLogs = sortedLogs.slice(0, logFiles.length - MAX_RETAINED_LOGS); for (const log of toDeleteLogs) { await fs.unlink(path.join(LOG_STORAGE_PATH, log)); } }
- 注意点:如果你的日志文件名不是按时间戳命名,也可以通过
fs.stat读取文件的创建时间排序,逻辑通用。 - 性能适配:清理逻辑是异步执行的,不会阻塞你的主业务数据写入流程,每小时仅运行一次的频率对高负载脚本几乎无额外性能损耗。
方案2:独立定时清理脚本(仅多进程写日志场景推荐)
如果你的业务是多个Node.js进程共同写入同个日志目录,存在创建日志文件的时序冲突,才需要单独部署定时清理脚本。你可以直接用原生setInterval每小时执行一次上述cleanExpiredLogs逻辑即可,不需要引入额外第三方依赖。
内容的提问来源于stack exchange,提问作者johnnyApplePRNG
相关产品推荐
相关产品推荐

