LINUX.ORG.RU

Библиотека логгирования для C++

 ,


2

5

Ищу библиотеку логгирования для C++.

Чего хочется:

  • Компактного и красивого логгирования вроде
    LOG(warn) << "This code sucks!"
    
    //в принципе, можно сделать свой макрос
  • Опциональная поддержка синтаксиса printf.
  • Ротация лог-файлов по размеру и/или по количеству.
  • Одновременный вывод в файл и в stdout.
  • Потокобезопасность.

Я уже смотрел на:

  • Boost.Log - синтаксис настройки сложный и неприятный, но это полбеды. Вторая проблема - это boost::shared_ptr, я пишу на C++14 и у меня уже есть std::shared_ptr и прочие, но буст упорно хочет только собственные поинтеры. Фу.
  • Easylogging++ https://github.com/easylogging/easyloggingpp Либа почти прекрасна, кроме того, что она - это единственный хэдер размером в 7 тыс строк! Разобраться в этой каше сложно. А ещё и тащить за собой надо, и обновлять вовремя. Отдельные динамические библиотеки поприятнее будут с точки зрения сопровождения.
  • log4cxx, log4c, log4cplus - пытаются сделать одну и ту же вещь, но как-то топорно, и умеют немногое.
  • log4cpp - это ужасно:
    root << log4cpp::Priority::ERROR << "Streamed root error";
    

И ещё вагон и маленькая тележка других либ, которые используются в полтора проекта.

Что делать?

У меня первое знакомство с Яп для продакшена всегда начинается с написания логгера, поэтому он всегда под рукой.

Oxdeadbeef ★★★
()

напиши обертку для log4cpp и не парься, минимальный proof of concept в твоих терминах:

class LOG
{
    public:
        LOG(log4cpp::Priority priority)
            : m_priority(priority) { }

        ~LOG()
        {   
            root << priority << m_buffer.str();
        }

        template<typename T>
        LOG& operator<<(T const& v)
        {   
            m_buffer << v; return *this;
        }

    private:
        log4cpp::Priority m_priority;
        std::stringstream m_buffer;
};

соответственно usage:

LOG(log4cpp::Priority::ERROR) << "This code sucks!";

PS как заменить log4cpp'шные enum'ы на свои, надеюсь, догадаешься

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 3)

Сам напиши как хочется, это около сотни строк кода если не считать ротации логов.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Сам напиши как хочется, это около сотни строк кода если не считать ротации логов.

Если предусмотреть, например, многопоточность (ве мы же дь не хполуотим чить такое?), да такую, чтобы она не мешала самим тредам работать (мы же не хотим, чтобы они все лочились на записи), да и чтобы грамотно разделить релиз с дебагом, и совместить это всё с хотелками ТС, я думаю, сотни строк не хватит :-}

yoghurt ★★★★★
()
Ответ на: комментарий от tailgunner

Тоже не понял. Этим же занимается специальный пакет ПО.

Deleted
()

Пиши printf'ами в stdout, потом в стартовом скрипте оборачивай во внешний логгер (внезапно, такой уже есть и как ни странно зовется logger), остальное делай стандартными утилитами типа logrotate.

Reset ★★★★★
()

man openlog, шаровар ты вячеслава этакий.

anonymous
()

Кстати, на проде я тоже только велосипеды видел.

Для быстрогр старта, могу посоветовать, выбрать ту,где интерфейс больше нравится.

pon4ik ★★★★★
()

замечу, что ни разу не было проблем с бустом и std. использую и то, и другое и они не конфликтуют.

Iron_Bug ★★★★★
()

У нас printf-like велосипед, причём весьма годный. Можно прямо в рантайме конфигурить, какие подсистемы/модули с каким severity трейсить. Есть ли открытые аналоги?

fmdw
()

Напиши функцию которая по первому вызову открывает консольное окошко и выводит туда протокол работы/логи по типу printf.

Deleted
()

root << log4cpp::Priority::ERROR << «Streamed root error»;

Ну вот посмотри, например, как я это заюзал. Смотреть include/logger.h и include/logdefs.h

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от yoghurt

Если предусмотреть, например, многопоточность (ве мы же дь не хполуотим чить такое?), да такую, чтобы она не мешала самим тредам работать (мы же не хотим, чтобы они все лочились на записи)

Это единственная проблема и то она существует если логгер использовать как-то слишком неестественно. При разумном использовании лок на записть в stderr или syslog вполне переживаем и незаметен.

mashina ★★★★★
()
Ответ на: комментарий от tailgunner

Ротация логов вручную? Но зачем?

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

mashina ★★★★★
()

Компактного и красивого логгирования вроде

qDebug() << anyClassYourLikeButNotQString550Smile;

Опциональная поддержка синтаксиса printf.

QString::arg и ненужен этот ужасный printf

Одновременный вывод в файл и в stdout.

SOMEDEBUG(«nobody's fault but mine»);
int z = -1 / 0;

как это будет реализовано? каждый раз файл будет открываться и закрываться ?
я вывожу только в stderr, а далее tee выводит и на экран и в файл

x905 ★★★★★
()

Что делать?

Мы писали свой. Простой и шустрый. Чего и тебе рекомендую.

MikeDM ★★★★★
()
Ответ на: комментарий от eao197

Ротация логов вручную? Но зачем?

А как, по-твоему, правильно?

В Linux есть стандартный сервис logrotate. В Венде, наверное, есть что-то похожее.

tailgunner ★★★★★
()
Ответ на: комментарий от Stil

Но тоже header-only

Но

Да с каких пор это плохо?

Таки это не так уж и плохо с тех пор как появились прекомпилированные заголовочники.

jeuta ★★★★
()
Последнее исправление: jeuta (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Не нам, а вам.

У нас уже есть. Мы с вами поделиться хотели.

Pavval ★★★★★
()
Ответ на: комментарий от tailgunner

В Linux есть стандартный сервис logrotate.

Т.е. кроме апликухи нужно будет настраивать еще и logrotate? И так на каждый инстанс апликухи, коих на одном сервере может быть N?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

В Linux есть стандартный сервис logrotate.

Т.е. кроме апликухи нужно будет настраивать еще и logrotate?

Т.е. в пакете будет конфигурационный файл logrotate.

И так на каждый инстанс апликухи, коих на одном сервере может быть N?

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

tailgunner ★★★★★
()

sd_journal_print(3)

Базарю. Ёлочки потом на шаблонах прикрутишь, остальное есть.

d_a ★★★★★
()

Log4cxx адекватен.

Что в нём не хватает?

anonymous
()
Ответ на: комментарий от eao197

На счет ротации - плюсую logrotate.

Т.е. кроме апликухи нужно будет настраивать еще и logrotate?

logrotate на нормальных серверах уже должен стоять. Ты просто докидываешь конфиг для своей аппликухи.

Загляни у себя в /etc/logrotate.d/

Kroz ★★★★★
()

Самому писать, иначе везде будет:

Разобраться в этой каше сложно. А ещё и тащить за собой надо, и обновлять вовремя.

peregrine ★★★★★
()

tailgunner, romeo250501, Reset, mashina, Kroz

Забыл уточнить, что это прикладная кросс-платформенная софтина, потому тут системный логгер (типа syslog) или logrotate не применим, так как логи будут писаться в файл в каталоге юзера. Иначе я бы давно использовал syslog и logrotate или sd_journal_print.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от x905

как это будет реализовано? каждый раз файл будет открываться и закрываться ?

Нет, лог-файл открывается при инициализации программы и закрывается при завершении (или системой, если прога крашанулась).

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

(или системой, если прога крашанулась).

у меня с использованием QFile получается нулевой файл при падении программы

можно рабочий пример с логгером, который умело закроет (системой) файл при падении ?

x905 ★★★★★
()
Ответ на: комментарий от yoghurt

я думаю, сотни строк не хватит :-}

Собственный велосипед, используемый в продакшен.

Потратил один день на начальную реализацию с тестированием, потом несколько раз по 5 минут — добавление функционала по надобности.

  • блокирующий или dedicated режимы
  • бинарные, текстовые или s-expr
  • вывод в поток, файл, консоль или одновременно
  • ротация по размеру и количеству логфайлов
  • настраиваемый timestamp и формат шапки лога
  • нет внешних зависимостей
  • возможность расширения
% sloccount ./src 
Creating filelist for src
Categorizing files.
Finding a working MD5 command....
Found a working MD5 command.
Computing results.

SLOC	Directory	SLOC-by-Language (Sorted)
1111    src             lisp=1111

Totals grouped by language (dominant language first):
lisp:          1111 (100.00%)

Total Physical Source Lines of Code (SLOC)                = 1,111
Development Effort Estimate, Person-Years (Person-Months) = 0.22 (2.68)
 (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months)                         = 0.30 (3.64)
 (Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule)  = 0.74
Total Estimated Cost to Develop                           = $ 30,175
 (average salary = $56,286/year, overhead = 2.40).
Oxdeadbeef ★★★
()
Ответ на: комментарий от Hertz

за лисп тут с говном попытаются сожрать.

а я в домике, и мне ничего не страшно.

Oxdeadbeef ★★★
()
Ответ на: комментарий от Hertz

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

Oxdeadbeef ★★★
()
Ответ на: комментарий от x905

у меня с использованием QFile получается нулевой файл при падении программы

можно рабочий пример с логгером, который умело закроет (системой) файл при падении ?

Попробуй делать flush после каждой записи. По-умолчанию в QIODevice (точно в QFile) буферизация записи. Если принудительно сбрасывать буфер после каждой записи (flush), то данные должны быть записаны на накопитель немедленно.

Chaser_Andrey ★★★★★
() автор топика
Последнее исправление: Chaser_Andrey (всего исправлений: 1)
Ответ на: комментарий от Chaser_Andrey

Попробуй делать flush после каждой записи.

да, так ок

но я пока остановился на варианте: myapp 2>&1 | tee -a tee_log.txt

тем самым я имею и лог и файл

x905 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.