【发布时间】:2014-04-04 18:12:38
【问题描述】:
我正在将记录写入 node.js 中的文件,我需要每隔这么多行或在一段时间后用一个新文件轮换文件,但我不能在此过程中丢失任何行。如果我尝试使用 fs.createWriteStream 创建一个新流,我最终会通过覆盖旧流而丢失行。任何建议将不胜感激。
【问题讨论】:
-
记录了某种日志?
-
记录为 csv 格式,以批量发送到数据库。
我正在将记录写入 node.js 中的文件,我需要每隔这么多行或在一段时间后用一个新文件轮换文件,但我不能在此过程中丢失任何行。如果我尝试使用 fs.createWriteStream 创建一个新流,我最终会通过覆盖旧流而丢失行。任何建议将不胜感激。
【问题讨论】:
不要覆盖旧流。将新流创建为单独的资源。
var activestream;
function startup() {
activestream = fs.createWriteStream('path');
}
function record(line) {
activestream.write(line);
}
function rotate() {
var newstream = fs.createWriteStream('path2');
activestream.end();
activestream = newstream;
}
...类似的东西应该可以工作。显然,您必须弄清楚如何管理路径。
【讨论】:
我将在这里给出一个非常规的答案。
您可以考虑像winston 这样的现成库,它带有经过良好测试的功能,可以完全满足您的需求。考虑到它是用来写日志的,但你也可以很容易地写你的 csv 条目。
使用 winston 的另一大优势是它支持多种传输,因此您不仅可以写入文件并旋转它们,还可以写入其他媒体 MongoDB 和其他一些媒体。
它还可以执行条件写入等操作,您可以定义自定义“日志级别”以将不同的功能记录写入文件。
我建议您在制作自己的解决方案之前先检查一下。
【讨论】:
我建议编写您自己的流管理器,类似于 Jason 的,但不是在请求旋转时结束流,而是让写入完成,暂停流,旋转文件,然后恢复流。每个文件只需要一个流,您不需要重新创建它。
【讨论】: