Регистратор в отдельном потоке C ?

#c #multithreading #logging

#c #многопоточность #ведение журнала

Вопрос:

При входе в глубокий цикл существуют ли регистраторы, которые позволяют генерировать сообщение журнала в текущем потоке, а затем записывать его на диск из другого потока?

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

Или разница может быть незначительной из-за кэша?

Комментарии:

1. Нравится Boost. Асинхронная ссылка журнала ?

Ответ №1:

Регистратор (или любая программа, на самом деле), который ставит операцию в очередь для обработки другим потоком, а затем немедленно возвращает, называется асинхронным. Асинхронные регистраторы существуют. Вот тот, который я использовал: g2log. Он кроссплатформенный и был протестирован на Windows и Linux.

Имеет ли асинхронное ведение журнала какие-либо преимущества для вас, зависит от того, сколько вы регистрируете.

Ответ №2:

Где вы регистрируетесь? Windows? Linux?

Если вы используете Linux и работаете в очень чувствительной к производительности среде, вы могли бы взглянуть на LTTng. Был разговор на FOSDEM (Youtube) об их подходе к ведению журнала. Суть этого: записывайте не строки, а коды ошибок и аргументы в (общую) память и используйте отдельный процесс для записи журнала на диск (общая память, сопоставленная другому процессу, сохраняется после дампа ядра).

Ответ №3:

Другой асинхронный регистратор из библиотеки POCO:

http://pocoproject.org/docs/Poco .AsyncChannel.html