Який найефективніший потокобезпечний реєстратор C ++? [зачинено]


85

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

У мене проблема полягає в тому, що він показує ім'я файлу, номер рядка тощо, навіть у режимі випуску. Якщо ви можете сказати мені, як вимкнути цю інформацію, моя проблема може бути вирішена. У будь-якому випадку, який найефективніший реєстратор в C ++ для моєї ситуації?


23
Я швидко приходжу до висновку, що у boost є все. Навіть якщо цього не стане, він з’явиться, коли ви знову подивитесь!
Мартін Беккет

20
Не можу зрозуміти, чому це закрито. Він задав конкретне і вимірне запитання. Якщо ми нехтуємо тим, який компілятор використовується, може бути лише один "найефективніший потокобезпечний реєстратор C ++". Stackoverflow в ці дні ....
JohnJohn


1
Дивіться також github.com/gabime/spdlog
Максик

Відповіді:


35

На жаль, на даний момент я не можу проголосувати. Наскільки я можу сказати, ніколи не використовуй лайно, як Apache log4cxx. Він містить серйозні помилки.

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

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


10
"кожен клас з віртуальними членами не має віртуального dtor" не повірив і мусив це перевірити. Досить невтішний апач.
ManuelSchneid3r

6
Зараз ви можете проголосувати проти :)
Фонд Моніки позов

5
>> "у кожному класі з віртуальними членами немає віртуального dtor" Хоча це і не чудово, це не означає, що воно викликає проблему. Проблема лише в тому, що класи видаляються за динамічним, а не за статичним типом. Це одне лише не є проблемою і не означає, що пам’ять витікає.
evilrix

1
@evilrix У класах є віртуальні учасники, але немає віртуального dtor. Класи не мають захищених / приватних нових операторів. Насправді це дуже поганий і поганий код, який ніколи не повинен був виходити. Отже, у чому Ваша думка?
kirsche40

@ kirsche40 Я вважав, що моя думка була досить чіткою. Який фрагмент мого пояснення того, як формулюється стандарт, ви не зрозуміли? Дозвольте мені переформулювати: це проблема, якщо ви намагаєтесь видалити за допомогою покажчика базового класу. У цьому випадку, якщо деструктор не є віртуальним, поведінка не визначена. З цього приводу стандарт незвично зрозумілий. Я майже впевнений, що жодне з того, що я сказав, не означає, що я прихильник ОП використовує це як реалізацію.
evilrix

19

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


4
І навіть якщо їм не подобається Пантей, список "конкурентів" на сторінці, на яку ви посилаєтесь, є інформативним.
jwd

10

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

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


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 пропонує саме такий вид функціональності, але він не має неявних залежностей коду, які має Пантейос. logog є потокобезпечним, і він забезпечує високий ступінь контролю над тим, які типи повідомлень реєструються в будь-який момент.

Я автор і супровідник логотипів, тому моя думка дещо упереджена. Але я переглянув rlog, Pantheios та інші системи реєстрації, перш ніж застосувати цю.

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


Оновлене посилання, дякую за примітку.
johnwbyrd,

4

Деякі накладні витрати можуть траплятися у ваших макросах / потоках. Потрібно бути дуже обережним, щоб не складати рядок, що реєструється, коли журналювання вимкнено.

Розумне використання потоків та оператора?: Дозволяє це робити, як і макроси.



2

можливо пантеї,
хоча я не знаю, безпечний він для потоків чи ні ...


8
Це безпечно для ниток
dcw

2

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


8
На жаль, c-log знаходиться під GPL, що означає, що ви не можете використовувати його із програмним забезпеченням, що не сумісне з GPL (наприклад, власним комерційним). Це робить його непридатним для багатьох користувачів.
chris

тепер у github.com/0xmalloc/c-log немає ЛІЦЕНЗІЇ Це безкоштовно для комерційного та особистого користування.
user2538508

2
Ви автор c-log? Якщо так, то настійно рекомендую вам чітко вказати (на сторінці Github, файл readme та коментарі у вихідному коді), за якою ліцензією випущено ваше програмне забезпечення. Навіть якщо це має бути загальнодоступним (що я не рекомендую!), Ви повинні чітко це зазначити. З огляду на це, існує безліч «комерційних» (тобто дозвільних) ліцензій з відкритим кодом на вибір - найпопулярнішими є Apache, BSD або MIT.
chris

Лише Linux? ( #include <pthread.h>...)
rustyx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.