2016-04-16 2 views
0

Как я могу реализовать систему, в которой несколько процессов Node.js записывают в тот же файл с fs.createWriteStream, чтобы они не перезаписывали данные? Похоже, что настройка по умолчанию для fs.createWriteStream заключается в том, что файл очищается при вызове этого метода. Моя цель состоит в том, чтобы очистить файл один раз, а затем все остальные последующие авторы только добавляют данные.fs.createWriteStream для нескольких процессов

Должен ли я использовать fs.createWriteStream, а затем fs.appendFile? Или есть способ открыть поток для каждого процесса, а не только для первого процесса открыть файл?

+0

Считаете ли вы использование посредника для делегирования записи журнала? Например, syslog, служба регистрации третьей стороны или даже выделенный процесс узла, который записывает входящие запросы журнала (например, через udp или unix-сокет или что-то еще) в файл. – mscdex

+0

Да, спасибо, что это хорошее наблюдение, на самом деле мне, вероятно, придется это сделать. Я полагаю, что для каждого дочернего процесса было бы более результативно напрямую обращаться к файлу; однако, данные файла могут быть повреждены, а данные не в порядке? Поэтому я передаю stderr (который является рассматриваемым потоком данных) в один родительский процесс node.js, который затем записывает данные в файл. Менее эффективен, поскольку родительский процесс является узким местом, но, вероятно, является прекрасным. –

ответ

2

Должен ли я использовать fs.createWriteStream, а затем fs.appendFile?

вы также можете использовать.

с fs.createWriteStream вы должны изменить флаг, как это:

fs.createWriteStream('your_file',{ 
    flags: 'a+', // default is 'w' (just 'a' might be enough here, i'm not sure) 
}) 

это должно создать файл, если он не существует, или открыть его с доступом на запись, если она существует, и установить указатель на конец , (append mode)

Как использовать fs.appendFile должно быть ясно, и это почти так же.

Теперь проблема с несколькими процессами, обращающимися к одному файлу. Очевидно, что только один процесс может открыть один и тот же файл с возможностью записи в одно и то же время. Поэтому вам нужно дождаться, когда файл будет выпущен, если другой процесс имеет доступ на запись. Для этого вам, вероятно, понадобится библиотека.

это один, например: https://www.npmjs.com/package/lockup
или это один: https://github.com/Perennials/mutex-node
вы также можете найти много больше здесь: https://www.npmjs.com/browse/keyword/lock
или здесь: https://www.npmjs.com/browse/keyword/mutex

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

Смежные вопросы