Если вы хотите записать в файл журнала, то есть добавить данные в конец файла, никогда не используйте 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так, ваш файл закончится, когда ваш процесс закончится, и вы избегаете открывать слишком много файлов.