Коли ви хочете записати файл журналу, тобто додавання даних до кінця файлу, ніколи не використовуйте appendFile. appendFileвідкриває обробку файлів для кожного фрагмента даних, який ви додаєте у свій файл, через деякий час ви отримуєте гарну EMFILEпомилку.
Можу додати, що appendFileце не простіше у використанні, ніж a 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, тому ваш файл закінчиться, коли процес закінчиться, і ви уникнете відкриття занадто багато файлів.