Многопоточное ведение журнала для высокопроизводительного приложения

У меня есть приложение (серверное приложение), для которого требуется обширный объем ведения журнала, и не должен слишком сильно влиять на производительность, позволяя вести журнал.

В приложении есть пул потоков рабочих потоков, выполняющих работу. Первоначально я собирался просто входить в эти потоки пула потоков, но тогда мне нужно было бы блокировать практически весь поток, и поэтому появляется мое "многопоточное" приложение.

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

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

Я хотел бы использовать библиотеку ведения журнала Boost.

Ответы

Ответ 1

Pantheios - это самая быстрая библиотека протоколирования для С++, насколько я знаю. Я рекомендую использовать его вместо Boost Logging. С Pantheios вы просто заходите в файл, и вам не важно, из какого потока. Вы можете поместить имя потока в префикс логарифма, если хотите, и он сделает все для вас.

Ответ 2

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

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

псевдокод:

 class SynchedQueue {
      void write(text) { lock() logfile.write(text) unlock() }

Или, если вы действительно хотите сделать это быстро, используйте внутреннюю очередь и перейдите из общедоступной очереди партиями по X строк за раз. Публичной очереди не нужно ждать ввода/вывода файла, которая может иметь относительное долгое время, а частная очередь получает строки редко. Хотя он, вероятно, будет еще медленнее, чем Pantheios.

Ответ 4

Apache log4cxx. Я видел довольно много мест, где он широко используется. И большинство из них - торговые приложения, многопоточные и приложения с низкой задержкой. log4cxx не уступает какой-либо библиотеке регистрации и доступен для С++ и Java (Apache log4j), эти 2, которые я использовал.

Ответ 5

Я использую и очень люблю система регистрации Petru Marginean. Это действительно легкий и аккуратный. Мне потребовалось немного времени, чтобы покрутить его, чтобы я мог приспособить его по своему вкусу, но как только вы это понимаете, это красота, и поскольку вся библиотека является всего лишь 1 заголовочным файлом в 250 строк, ее не так много, чтобы получить через.

Самая медленная часть этого - это использование объекта с ostringstream, но я сомневаюсь, что вы найдете что-нибудь быстрее. По крайней мере, не больше C, чем С++.

В своей второй статье и версии он показывает, как он сделал поток в потоковом режиме.

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

Ответ 6

Я не знаком с библиотекой Boost Logging, поэтому я не могу прокомментировать это.

NLog поддерживает ведение журнала из C/С++ и COM (а также из управляемых приложений .NET). Не уверен, что у вас есть характеристики производительности после или нет.

Вы также можете рассмотреть ETW. Это высокоскоростная система регистрации, реализованная в ядре Windows. Я не использовал его, но Microsoft, похоже, немного подталкивает его и делает его немного легче использовать с каждой версией. Они, конечно же, упрощают использование управляемого кода. Поскольку это стоит прямо сейчас, мне кажется, что мне сложно настроить, а затем получить результат. Я никогда не догадывался, что серьезно отнесся к внедрению ETW, поэтому я не могу комментировать, насколько это просто или сложно.