Безопасно ли межпроцессное взаимодействие log4cpp для записи в один и тот же файл?

Я начал использовать log4cpp. Я провел несколько тестов, потому что хочу, чтобы несколько процессов записывали в одни и те же файлы.

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

3.2. Is log4cpp thread-safe? The same instance of the log4cpp::Category object (a logger) can be used from different threads simultaneously without explicit synchronization. Concurrent access to the appenders will be prevented by the logger object itself. It will lock internal mutex each time when it comes to writing into appenders. So, it is safe, for example, to write from the multiple threads to the same logger which appends to the same file. Although, log4cpp is configured in such a way that two different loggers append to the same appender (it may be a file), then there will be no way for the logging framework to arrange proper addition and things can get mixed up. So this way of configuration is not recommended.

От здесь, и теперь я в этом сомневаюсь ...

У кого-нибудь есть опыт с этим?

Несколько минут назад я играл в arround с log4cpp, log4cxx, boost.log и некоторыми другими. Если вас не заставляют использовать log4cpp, я бы не рекомендовал его. boost.log поддерживает многопоточные / межпроцессные бэкэнды, называемые: Серверная часть очереди сообщений IPC, имеет лучшую документацию, и его можно расширить, чтобы иметь другие бэкенды (например, сеть в системный журнал).

user1810087 31.10.2018 14:13

@ user1810087 спасибо за это, я обязательно рассмотрю это ... мы немного привязаны к log4cpp, и было бы немного больно переключиться, но мы обернули его в наш собственный API, так что, возможно, это не так так плохо - я посмотрю. Но знаете ли вы, правильно ли log4cpp поддерживает межпроцессное взаимодействие?

code_fodder 31.10.2018 14:58

Я очень в этом сомневаюсь. Заглянув в код, кажется, что они используют (обычный) мьютекс или рекурсивный мьютекс (по умолчанию). Оба результата приводят к одному из: 1) мьютекс C++ 11 - не поддерживает IPC, 2) мьютекс pthread- вроде поддержки IPC 3) круговой раздел Windows - поддерживает IPC или 4) мьютекс бедного человека (самореализованный) - не поддерживает IPC. Плюс они вроде бы файлы блокируют.

user1810087 31.10.2018 16:05

@ user1810087 Мое тестирование показало, что он поддерживает IPC (только в том смысле, что я не потерял никаких данных и не получил искаженных строк данных) ... так что, возможно, блокировка файла - это то, что синхронизирует ... вероятно, достаточно хорошо для того, что мне нужно .. ... но не очень эффективно, я думаю! - спасибо за это обновление

code_fodder 31.10.2018 20:49
1
4
522
0

Другие вопросы по теме