我试图追加一个字符串到日志文件。但是writeFile会在每次写入字符串之前删除内容。

fs.writeFile('log.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
}); // => message.txt erased, contains only 'Hello Node'

有什么简单的方法吗?


当前回答

使用jfile包:

myFile.text+='\nThis is new line to be appended'; //myFile=new JFile(path);

其他回答

我的方法相当特别。我基本上使用WriteStream解决方案,但实际上没有使用stream.end()“关闭”fd。相反,我用软木塞/打开软木塞。这样做的好处是RAM使用率低(如果这对任何人来说都很重要的话),而且我相信它用于日志/记录更安全(我最初的用例)。

下面是一个非常简单的例子。注意,我刚刚为showcase添加了一个伪for循环——在产品代码中,我正在等待websocket消息。

var stream = fs.createWriteStream("log.txt", {flags:'a'});
for(true) {
  stream.cork();
  stream.write("some content to log");
  process.nextTick(() => stream.uncork());
}

Uncork将在下一个标记中将数据刷新到文件中。

在我的场景中,各种大小的峰值每秒可达~200次写入。但是在夜间,每分钟只需要少量的写入。即使在高峰时段,代码也非常可靠。

使用fs。appendFile或fsPromises。当您需要向文件中追加内容时,appendFile是最快和最健壮的选项。

与建议的一些答案相反,如果文件路径提供给appendFile函数,它实际上会自行关闭。只有传入fs.open()之类的文件句柄时,才需要注意关闭它。

我在一个超过5万行的文件中试过。

例子:

(async () => {
  // using appendFile.
  const fsp = require('fs').promises;
  await fsp.appendFile(
    '/path/to/file', '\r\nHello world.'
  );

  // using apickfs; handles error and edge cases better.
  const apickFileStorage = require('apickfs');
  await apickFileStorage.writeLines(
    '/path/to/directory/', 'filename', 'Hello world.'
  );
})();

裁判:https://github.com/nodejs/node/issues/7560

fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
fs.closeSync(fd)

使用+标记追加并创建一个文件(如果不存在):

fs.writeFile('log.txt', 'Hello Node', { flag: "a+" }, (err) => {
  if (err) throw err;
  console.log('The file is created if not existing!!');
}); 

文档:https://nodejs.org/api/fs.html # fs_file_system_flags

尝试使用flags: 'a'将数据附加到文件中

 var stream = fs.createWriteStream("udp-stream.log", {'flags': 'a'});
  stream.once('open', function(fd) {
    stream.write(msg+"\r\n");
  });