Что является наиболее эффективным потокобезопасным регистратором С++?

Я работаю над высокопроизводительным многопоточным приложением. Я посмотрел на журнал Rlog, Ace и Boost. Я выбрал rlog, потому что я читал, что это был самый быстрый (когда ведение журнала отключено, оно имеет наименьшие издержки).

Проблема заключается в том, что она показывает имя файла, номер строки и т.д. даже в режиме деблокирования. Если вы можете сказать мне, как закрыть эту информацию, моя проблема может быть решена. В любом случае, что является наиболее эффективным регистратором в С++ для моей ситуации?

Ответ 1

К сожалению, на данный момент я не могу проголосовать. Насколько я могу судить, никогда не используйте дерьмо, как Apache log4cxx. Он содержит серьезные ошибки.

  • Последняя версия ветки 0.9 - 0.9.7 и по-прежнему содержит утечки памяти, потому что каждый класс с виртуальными членами не имеет виртуального dtor.
  • Новейшая версия 0.10.x потеряла много функциональности от 0.9.x и не поддерживает обратную совместимость. Вы вынуждены переписать много своего кода.
  • Весь проект, по-видимому, не поддерживается. Выпуск 0.11.xx объявлен на 2 года.

По-моему, вы должны идти с повышением.

Ответ 3

У меня был успех с log4cxx на http://logging.apache.org/log4cxx/index.html. Это С++ версия популярного Log4j logger, легко настраивается либо через conf файл, либо в коде. Накладные расходы при его отключении минимальны (вызов метода и целочисленное сравнение).

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

Ответ 4

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

Я автор logog и сопровождающий, поэтому мое мнение немного предвзято. Но перед реализацией этого я просмотрел rlog, Pantheios и другие системы ведения журналов.

https://github.com/johnwbyrd/logog.

Ответ 5

Вот как вы могли бы отключить дополнительную информацию, которую предоставляет rlog (например, имя файла, номер строки и т.д.). Когда вы инициализируете rlog в своей функции main() (или в любом случае), вы можете сделать следующее:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

Второй аргумент StdioNode - это флаги для управления выходом. Проверьте документацию rlog (может быть сгенерирована с помощью Doxygen) для всего списка возможных флагов. Тот, что приведен в примере, делает rlog только цветным результатом в соответствии с серьезностью, без добавления какой-либо другой информации.

Ответ 6

Некоторые из накладных расходов могут возникать в ваших макросах/потоках. Вы должны быть очень осторожны, чтобы не сочинять строку, регистрируемую при отключении журнала.

Умное использование потоков и оператор?: позволяет вам это делать, как и макросы.

Ответ 7

возможно pantheios

хотя я не знаю, является ли это потокобезопасным или нет...

Ответ 9

попробуйте c-log lib, https://github.com/0xmalloc/c-log, быстрый, стабильный и потокобезопасный журнал lib для языка C/С++.