Какой самый эффективный потокобезопасный регистратор C ++? [закрыто]

85

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

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

cppalphadev
источник
23
Я быстро прихожу к выводу, что в бусте есть все. Даже если этого не произойдет, он появится, когда вы посмотрите еще раз!
Мартин Беккет,
20
Я не понимаю, почему это закрыто. Он задал конкретный и измеримый вопрос. Если пренебречь используемым компилятором, может быть только один «наиболее эффективный потокобезопасный регистратор C ++». Stackoverflow в наши дни ....
Джон Джон
1
См. Также github.com/gabime/spdlog
maxik

Ответы:

35

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

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

На мой взгляд, стоит пойти с наддувом.

Кирше40
источник
10
"у каждого класса с виртуальными членами нет виртуального dtor" не поверили и пришлось это проверить. Довольно разочаровывает Apache.
ManuelSchneid3r
6
Теперь вы можете проголосовать против :)
Иск Фонда Моники
5
>> «Каждый класс с виртуальными членами не имеет виртуального dtor». Хотя это не замечательно, это не означает, что это вызывает проблемы. Проблема возникает только в том случае, если классы удаляются по их динамическому, а не статическому типу. Это само по себе не является проблемой и не означает утечки памяти.
evilrix
1
@evilrix У классов есть виртуальные члены, но нет виртуального dtor. У классов нет защищенных / частных операторов new. Фактически, это очень плохой и плохой код, который никогда не должен был быть выпущен. Так в чем твоя точка зрения?
kirsche40
@ kirsche40 Я думал, что моя точка зрения довольно ясна. Какую часть моего объяснения формулировки стандарта вы не поняли? Позвольте мне перефразировать: это проблема, если вы попытаетесь удалить с помощью указателя базового класса. В этом случае, если деструктор не виртуальный, поведение не определено. Стандарт необычайно ясен по этому поводу. Я почти уверен, что ничто из того, что я сказал, не подразумевает, что я защищаю OP, использует это как реализацию.
evilrix
19

Pantheios считается самой производительной библиотекой журналов C ++ , а также претендует на то, чтобы быть единственной, которая на 100% безопасна по типу (см. Эту статью о связанной библиотеке, объясняющей, почему библиотеки на основе printf () / iostream не являются типобезопасными. Безопасно)

dcw
источник
4
И даже если им не нравится Pantheios, список «конкурентов» на странице, на которую вы указали, является информативным.
jwd
10

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

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

user54700
источник
9

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

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

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

маниока
источник
9

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

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

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

Johnwbyrd
источник
Обновленная ссылка, спасибо за заметку.
johnwbyrd
4

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

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


источник
2

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

mhd
источник
8
Это потокобезопасный
dcw
2

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

user2538508
источник
8
К сожалению, c-log находится под GPL, что означает, что вы не можете использовать его с несовместимым с GPL (например, проприетарным коммерческим) программным обеспечением. Это делает его непригодным для многих пользователей.
Крис
Теперь в github.com/0xmalloc/c-log нет ЛИЦЕНЗИИ. Это бесплатно для коммерческого и личного использования.
user2538508
2
Вы автор c-log? Если это так, я настоятельно рекомендую вам явно указать (на странице Github, в файле readme и комментариях в исходном коде), по какой лицензии выпущено ваше программное обеспечение. Даже если он должен быть общественным достоянием (что я не рекомендую!), Вы должны явно указать это. При этом существует множество «коммерческих» (т. Е. Разрешительных) лицензий с открытым исходным кодом на выбор - самыми популярными являются Apache, BSD или MIT.
Крис
Только Linux? ( #include <pthread.h>...)
rustyx