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