Quando você deseja gravar em um arquivo de log, ou seja, anexando dados ao final de um arquivo, nunca use appendFile. appendFileabre um identificador de arquivo para cada dado que você adiciona ao seu arquivo, após um tempo você recebe um EMFILEerro bonito .
Posso acrescentar que appendFilenão é mais fácil de usar do que a WriteStream.
Exemplo com 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());
Até 8000 no meu computador, você pode anexar dados ao arquivo e obter o seguinte:
{ 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' }
Além disso, appendFile gravará quando estiver ativado, para que seus logs não sejam gravados com carimbo de data e hora. Você pode testar, por exemplo, definir 1000 no lugar de 100000, a ordem será aleatória, depende do acesso ao arquivo.
Se você deseja anexar a um arquivo, deve usar um fluxo gravável como este:
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();
Você termina quando quiser. Você nem precisa usar stream.end(), a opção padrão é que AutoClose:true, assim, seu arquivo será encerrado quando seu processo terminar e você evitará abrir muitos arquivos.