Что является наиболее эффективным потокобезопасным регистратором С++?
Я работаю над высокопроизводительным многопоточным приложением. Я посмотрел на журнал Rlog, Ace и Boost. Я выбрал rlog, потому что я читал, что это был самый быстрый (когда ведение журнала отключено, оно имеет наименьшие издержки).
Проблема заключается в том, что она показывает имя файла, номер строки и т.д. даже в режиме деблокирования. Если вы можете сказать мне, как закрыть эту информацию, моя проблема может быть решена. В любом случае, что является наиболее эффективным регистратором в С++ для моей ситуации?
Ответы
Ответ 1
К сожалению, на данный момент я не могу проголосовать. Насколько я могу судить, никогда не используйте дерьмо, как Apache log4cxx. Он содержит серьезные ошибки.
- Последняя версия ветки 0.9 - 0.9.7 и по-прежнему содержит утечки памяти, потому что каждый класс с виртуальными членами не имеет виртуального dtor.
- Новейшая версия 0.10.x потеряла много функциональности от 0.9.x и не поддерживает обратную совместимость. Вы вынуждены переписать много своего кода.
- Весь проект, по-видимому, не поддерживается. Выпуск 0.11.xx объявлен на 2 года.
По-моему, вы должны идти с повышением.
Ответ 2
Pantheios считается лучшим выполняющим библиотеку протоколов С++, а также претендовать на то, чтобы быть единственным, который на 100% безопасен по типу (см. в этой статье о связанной библиотеке, объясняющей, почему библиотеки printf()/iostream не являются безопасными для типов)
Ответ 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
хотя я не знаю, является ли это потокобезопасным или нет...
Ответ 8
Poco имеет отличную поддержку регистрации...
http://pocoproject.org/slides/110-Logging.pdf
Ответ 9
попробуйте c-log lib, https://github.com/0xmalloc/c-log, быстрый, стабильный и потокобезопасный журнал lib для языка C/С++.