Я пишу записи в файл в node.js, и мне нужно чередовать файл с новым каждые столько строк или по прошествии некоторого времени, но я не могу потерять ни одной строки в процессе. Если я попытаюсь с помощью fs.createWriteStream создать новый поток, я потеряю строки, перезаписав старый поток. Любой совет будет очень признателен.

1
thekkid 4 Апр 2014 в 22:12
Записи какие-то журналы?
 – 
Shaunak
4 Апр 2014 в 22:19
Записи имеют формат csv для массовой отправки в базу данных.
 – 
thekkid
4 Апр 2014 в 22:47

3 ответа

Лучший ответ

Не перезаписывайте старый поток. Создайте новый поток как отдельный ресурс.

var activestream;

function startup() {
    activestream = fs.createWriteStream('path');
}

function record(line) {
    activestream.write(line);
}

function rotate() {
    var newstream = fs.createWriteStream('path2');
    activestream.end();
    activestream = newstream;
}

... что-то вроде этого должно сработать. Очевидно, вам придется выяснить, как управлять путями.

2
Jason 4 Апр 2014 в 22:47

Я собираюсь дать здесь нетрадиционный ответ.

Вы можете рассмотреть готовую библиотеку, такую ​​как winston, которая поставляется с хорошо протестированной функциональностью, чтобы делать именно то, что вы хотите. Учитывая, что он предназначен для записи журналов, вы также можете легко писать свои записи в CSV.

Еще одним большим преимуществом использования Winston является поддержка нескольких транспортов, поэтому вы можете писать не только в файлы и вращать их, вы также можете писать на другие носители, MongoDB и некоторые другие.

Он также выполняет такие вещи, как условная запись, и вы можете определить собственный «уровень журнала» для записи различных функциональных записей в ваш файл.

Я рекомендую вам проверить это, прежде чем готовить собственный раствор.

1
Shaunak 4 Апр 2014 в 22:53
Да, я думал сделать это раньше, но я бы предпочел иметь больше гибкости в соглашении об именах. Большое спасибо за ваш ответ!
 – 
thekkid
5 Апр 2014 в 00:44

Я бы порекомендовал написать собственный менеджер потоков, аналогичный Jason's, но вместо того, чтобы заканчивать поток при запросе поворота, позвольте записи закончиться, приостановите поток, поверните файл, а затем возобновите поток. Для каждого файла должен потребоваться только один поток, и вам не нужно его воссоздавать.

1
AlexMA 5 Апр 2014 в 01:25