Pull to refresh

Comments 22

По поводу недостатка — для нас очень большое ограничение, у нас обязательная поддержка старого GCC 3.4 в проекте, поэтому пока останемся на своем детском трехколесном велосипедике.

В syslog умеет писать?
syslog поддерживает там, где есть syslog.h
В плане кода с вашей стороны почти никакой разницы: что типа макросов SYSLOG(LEVEL) вместо LOG(LEVEL)
Насчет C++11, ругается из-за хедера type_traits, который сразу проверяет поддержку нового стандарта
Да я не то чтобы бросал рваться переписывать стабильный код который в продакшене больше года крутится) Так просто смотрю альтернативы…
Меня сейчас больше всего MUSL приглянулся, но увы, он не подерживает пока mmuless девайсы. Так что пока (может к счастью) все довольно просто и примитивно)
Если честно, не очень порадовал сам формат библиотеки. Один заголовочный файл на 6000 строк с макросами и шаблонами… и его я должен заинклюдить в каждом своем translation unit…

И еще я пока не понял по API, можно ли как-то динамически изменить уровень вывода в лог?

Допустим. У меня есть отладочный вывод на устройстве. Которое… маленькое. Файлы не попишешь. Я могу подключиться к устройству по телнет, и отдать команду изменить уровень дебажного вывода в одном из контекстов. Можно ли с этой либой подобного достичь?
Не подумайте что я как-то ругаю или подбное, простое любопытство насчет возможностей.
6000 строк с макросами и шаблонами… и его я должен заинклюдить в каждом своем translation unit…

Вероятно, многие из хедеров которые вы используете даже больше, а, кроме того, 6000 строк будет только один раз при первом вхождении, разве нет?
И еще я пока не понял по API, можно ли как-то динамически изменить уровень вывода в лог?

Да, можно.
Во-первых в командной строке (но это без динамики, только при старте), ну и во-вторых на лету тоже:
Скрытый текст
int main(int argv, char* argc[]) 
{
    /* Копия конфигурации по умолчанию */
    el::Configurations defaultConf;
    /* Изменим в ней флаг для вывода инфо сообщений */
    defaultConf.set(el::Level::Info, 
            el::ConfigurationType::Enabled, "false");
    /* Применим к логгеру по умолчанию */
    el::Loggers::reconfigureLogger("default", defaultConf);
    LOG(INFO)<<"Не будет выведено";
    LOG(WARNING)<<"Будет выведено";

    return 0;
}

Про изменение логирования — уже неплохо. А про «первое» вхождение Вы как-то либо неправы, либо не поняли меня =)
Впрочем я полагаю, эту проблему как раз легко решит precompiled header.
только один раз при первом вхождении

Он говорил про разные translation unit, а не про множественные включения в один.
_INITIALIZE_EASYLOGGINGPP. Он требуется для инициализации некоторых статических переменных и установки обработчика для крэшей.

Вот это смущает, почему нельзя всё это инициализировать просто при первом обращении к библиотеке?
Вероятно, на тот случай, если у вас будет крэш до того, как Вы что-то выведете в журнал (т.е. до первого обращения к библиотеке).
Потому что это — не инициализация, а определения переменных (обратите внимание, эта строчка должна находиться за пределами main). В идеальном мире вся эта радость должна была быть в отдельном файле, easylogging++.cpp, — но так как библиотека, по-видимому, заточена под программы класса все-в-одном-файле — то соответствующий код перенесли из отдельного модуля в макрос.
А что такого нужно объявлять в cpp-файле, чего нельзя было бы объявить в заголовочном?
struct Global
{
  static int& variable()
  {
    static int v;
    return v;
  }
};


Пример объявления не константной глобальной переменной, доступной через вызов функции, который широко используется при создании синглтонов.
Каждый программист должен написать плеер, аську, обертку над браузерным движком и конечно же библиотеку логгирования.
Да, а потом, как раз, можно посмотреть по сторонам и оценить, как это реализовали другие )
Поиграться можно, а использовать — рано. Всё-таки syslog (если есть) более удобен: все стандартно. Или же log4cplus: можно и динамически, и статически прилинковать, если надо монолитный бинарник. + формат настроек как в log4j позволяет не париться с настройками логирования(опять же все стандартно)
Я использую этот логгер в одном своем проекте. Не нравится ровно две вещи: во-первых, нельзя без смены макросов логировать в syslog/stderr (типа, выбора бэкэнда логирования), во-вторых, при парсинге argc/argv он не выкидывает свои опции из списка аргументов, поэтому следующий за ним getopt не очень удобно применять (например, указывая на неправильный формат аргументов). Впрочем, первое ограничение является самым неудобным, а кроме того, достаточно сложным в фиксе.
потокобезопасна? В частности во момент ротации логов.
Да. По умолчанию потокобезопасность отключена. Для включения нужно задефайнить "_ELPP_THREAD_SAFE".
Sign up to leave a comment.

Articles