当您想写入日志文件时,即将数据附加到文件末尾,永远不要使用appendFile。 appendFile 为您添加到文件中的每条数据打开一个文件句柄,一段时间后您会收到一个漂亮的 EMFILE 错误。
我可以补充一点,appendFile 并不比WriteStream 更容易使用。
以appendFile 为例:
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
fs.appendFile("append.txt", index+ "\n", function (err) {
if (err) console.log(err);
});
});
console.log(new Date().toISOString());
在我的电脑上最多8000,你可以将数据附加到文件中,然后你得到这个:
{ Error: EMFILE: too many open files, open 'C:\mypath\append.txt'
at Error (native)
errno: -4066,
code: 'EMFILE',
syscall: 'open',
path: 'C:\\mypath\\append.txt' }
此外,appendFile 将在启用时写入,因此您的日志不会按时间戳写入。您可以通过示例进行测试,将 1000 设置为 100000,顺序将是随机的,取决于对文件的访问。
如果你想追加到一个文件,你必须使用这样的可写流:
var stream = fs.createWriteStream("append.txt", {flags:'a'});
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
stream.write(index + "\n");
});
console.log(new Date().toISOString());
stream.end();
你想结束就结束。您甚至不需要使用stream.end(),默认选项是AutoClose:true,因此您的文件将在您的进程结束时结束,并且您避免打开太多文件。