В boost утвердили логгер Boost.Log by Andrey Semashev
От: ankorol Украина  
Дата: 29.03.10 09:59
Оценка: 2 (1) :)
Если верить С++ Next , логгер приняли в boost.
Ссылка на саму библиотеку здесь.
Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 29.03.10 10:31
Оценка: +1
Здравствуйте, ankorol, Вы писали:
A>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".

Т.е. ежели некий инструмент решили таки присоединить к сборнику библиотек "boost", то это априори расставляет все точки над "Ё", давая этой тулзени бесспорное преимущество?
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: ankorol Украина  
Дата: 29.03.10 10:47
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Т.е. ежели некий инструмент решили таки присоединить к сборнику библиотек "boost", то это априори расставляет все точки над "Ё", давая этой тулзени бесспорное преимущество?


Нет, но популярности ей это точно придаст + кое-какие гарантии на качество.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: potapov.d  
Дата: 29.03.10 10:54
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, ankorol, Вы писали:

A>>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".

R>Т.е. ежели некий инструмент решили таки присоединить к сборнику библиотек "boost", то это априори расставляет все точки над "Ё", давая этой тулзени бесспорное преимущество?


Бесспорное преимущество не в Boost TM, а в том что его много где используют. Соответственно появление логгера в бусте избавит от необходимости изобретать велосипед, которые за пять лет работы для разных проектов мне приходилось изобретать уже раза три или четыре.
Re: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Ytz https://github.com/mtrempoltsev
Дата: 29.03.10 12:28
Оценка: +2
Здравствуйте, ankorol, Вы писали:

A>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".


Нет не положит. Логирование должно быть настолько простым и незаметным, что-бы даже самый ленивый пользовался. Данный логгер этому требованию к сожалению не соответствует.
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: ankorol Украина  
Дата: 29.03.10 12:36
Оценка: 9 (2)
Здравствуйте, Ytz, Вы писали:

Ytz>Нет не положит. Логирование должно быть настолько простым и незаметным, что-бы даже самый ленивый пользовался. Данный логгер этому требованию к сожалению не соответствует.

For ones that don't want to read tons of clever manuals and just need a simple tool for logging, here you go:

#include <boost/log/trivial.hpp>

int main(int, char*[])
{
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
}

... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Ytz https://github.com/mtrempoltsev
Дата: 29.03.10 12:48
Оценка:
На таком уровне конечно. Только это уровень std::cerr, логирование здесь еще даже не начинается, а вот дальше там уже все не так радужно.
Re[4]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: ankorol Украина  
Дата: 29.03.10 12:56
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>На таком уровне конечно. Только это уровень std::cerr, логирование здесь еще даже не начинается, а вот дальше там уже все не так радужно.


Библиотека очень гибкая и настраиваемая, добится этого и при этом оставатся простой тяжело. В крайнем случае можно построить свой велосипед поверх Boost.Log но с настройками которые типичные для того или иного программиста и с удобным для него интерфейсом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Sni4ok  
Дата: 29.03.10 13:20
Оценка: +3 -1 :)
Здравствуйте, ankorol, Вы писали:

скачал исходники, аж 900кб для такой, как казалось бы простой вещи, как логер, более того сделан на стандартных стримах- тоесть даже без тестирования можно сказать что логер — тормоз(хотя конечно и подойдёт для 98% случаев).
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: uzhas Ниоткуда  
Дата: 29.03.10 15:30
Оценка: 1 (1) -1
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, ankorol, Вы писали:


A>>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".


Ytz>Нет не положит. Логирование должно быть настолько простым и незаметным, что-бы даже самый ленивый пользовался. Данный логгер этому требованию к сожалению не соответствует.

Согласен, что никакого конца велосипедам не будет.
Я заметил, что все системы логирования имеют пагубную привычку использовать синглтоны в своей реализации и поощрять распространение логирующих операторов по всему коду, что вносит бардак и неконтролируемость. Любой логирующий фреймворк, основанный на шаблонах, обречен на неудачу, ибо он не предоставляет интерфейсов. Шаблоны делают код сильно связным, обращение к глобальным функциям логирования делает код нетестируемым и не реюзабельным. Интерфейсы же обеспечивают слабую связность бизнес кода и логирующего кода.
Для маленьких\средних приложений подход с глобальными функциями логирования действительно оправдан. Разработчиком не надо сильно пыхтеть, чтобы вывести в лог какую-то информацию, для форматирования тоже предоставлены необходимые хелперы (типа operator<<).

Однако при работе с большими приложениями уже начинается совсем другая история:
  1. при появлении динамических библиотек начинаются проблемы с синхронизацией тех самых синглтонов. Ибо в них настраиваются всякие фильтры и другая конфигурация. Появляются баги о том, что в логах появляются debug сообщения, хотя все отконфигурировано для фильтрации таких сообщений (а про длл мы иногда забываем)
  2. появляются повышенные требования к логу:
    • должен быть локализован на 17 языков
    • должен содержать _осмысленную_ информацию для конечного пользователя. например, писать в логе "handle 319 was lost" нельзя писать для юзера и на это заводят баги. Юзер должен понимать по логу что же произошло, дабы не обращаться в суппорт.
    • нужно уметь менять уровни фильтрации через внешние ресурсы — файлы, реестр и тд в рантайме
    • нужно покрыть код юнит-тестами. даже факт логирования можно тестировать с помощью юнит-тестов
    • иногда в зависимости от сценария, юзеру требуется показывать или не показывать одну и ту же запись. то есть есть некий код, который что-то логирует. иногда требуется, чтобы он ничего не логировал и без нарушения OCP с помощью интерфейса мы могли бы решить эту проблему.
    • логи не должны корраптиться при падении приложения (либо восстанавливаться при запуске приложения)
  3. появляются проблемы с логами на стрт-апе и выходе приложения, начинаются пляски вокруг порядка инициализации глобальных\статических объектов.

С помощью интерфейсов можно отключать логи у целой подсистемы (с помощью NullLogger) в рантайме. Аналогично, можно измерять влияние системы логирования на общий перформанс приложения. Опыт показывает, что все обращения с внешними ресурсами (реестр, базы данных, файлы) должны осуществляться через интерфейсы. К сожалению, мне не удалось еще поработать с подобной системой логирования, но мне кажется имеет смысл опробовать такой подход.
Кстати, логирование, вообще говоря, может иметь два вида: вид отладки и вид для конечного юзера. Надо уметь различать эти два типа. Иногда их называют трейсы и логи.
Трейс — это след в системе. Он не обязан быть локализован и вообще, к нему предъявляется мало требований. В трейсе могут фигурировать сущности из области решения (о которых пользователь может и не знать).
Лог же более строг: должен быть локализован и быть осмысленным. Это запись, оставленная пользователю и представляющая ценность для него. В этой записи фигурируют бизнес-объекты.
Re[4]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: jazzer Россия Skype: enerjazzer
Дата: 29.03.10 18:43
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>На таком уровне конечно. Только это уровень std::cerr, логирование здесь еще даже не начинается, а вот дальше там уже все не так радужно.


Примеры "не такой радужности" будут? С указанием, как надо было сделать, если можно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: jazzer Россия Skype: enerjazzer
Дата: 29.03.10 18:46
Оценка:
Здравствуйте, uzhas, Вы писали очень много общих слов.

Есть какое-то более конкретные претензии именно к этой библиотеке? С примерами, по пунктам, и с указанием, как надо.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: skeptik_  
Дата: 29.03.10 18:58
Оценка:
Здравствуйте, uzhas, Вы писали:

жабист штоле? Иначе малопонятен упор на слово интерфейс. Хинт — интерфейс не обязан начинаться со слова интерфейс.
Re[5]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Ytz https://github.com/mtrempoltsev
Дата: 29.03.10 19:20
Оценка: -1 :)
Здравствуйте, jazzer, Вы писали:

J>Примеры "не такой радужности" будут? С указанием, как надо было сделать, если можно.


Велосипед собственного изготовления.
Минимальная настройка:

void Init()
{
    std::auto_ptr<AbstractWriter> writer(new SimpleWriter());
    std::auto_ptr<AbstractStream> console(new ConsoleStream());
    writer->AddStream(console.release());
    SetupLog(writer.release());
}


Расширенная настройка:
void Init()
{
    using namespace Logger;
    std::auto_ptr<AbstractWriter> writer(new ThreadedWriter());
    std::auto_ptr<AbstractStream> console(new ConsoleStream());
    console->SetLayout(Layout()
            << Layout::TRACE_LEVEL
            << Layout::EXACT_TIME
            << Layout::CODE_FILE
            << Layout::CODE_LINE
            << Layout::MESSAGE);
    writer->AddStream(console.release());
    std::auto_ptr<AbstractStream> file(new FileStream(
            "/tmp/log",
            1024 * 100,    // Максимальный размер файла
            10));        // Максимальное количество файлов
    file->SetLayout(Layout()
            << Layout::DATE
            << Layout::TIME
            << Layout::THREAD_ID
            << Layout::MESSAGE);
    writer->AddStream(file.release());
    writer->AddStream(new SyslogStream());
    SetupLog(writer.release(), Debug);    // Уровень логирования Debug
}

Или из конфигурационного файла:

void Init()
{
    SetupLog("config.xml");
}

Пример файла:

<logger trace_level="debug">
  <writer type = "simple" />
  <stream type = "console" 
    layout = "trace_level exact_time thread_id code_function message" />
  <stream type = "file" 
    layout = "trace_level date time message"
    dir = "/tmp/Log/"
    file_name = "log-file"
    max_file_size = "20000"
    max_file_count = "4" />
  <stream type = "syslog" 
    layout = "message" />
</logger>

Использование:

#include <logger/logger.h>
...
LOG(Info) << "Start";
LOG(Debug) << Sub(1) << "Message" << 1;
LOG(Info) << "Done";
LOG_IF(Warning, 1 < 2) << "Ok";

Boost Log извините разбирать не хочу — страшно, но буду рад если покажете как просто сделать то же самое.
P.S. А еще он вывод красиво раскрашивает
Re[6]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: jazzer Россия Skype: enerjazzer
Дата: 29.03.10 19:40
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, jazzer, Вы писали:


J>>Примеры "не такой радужности" будут? С указанием, как надо было сделать, если можно.

Ytz>Boost Log извините разбирать не хочу — страшно, но буду рад если покажете как просто сделать то же самое.
Т.е. примеров "не такой радужности" не будет. Понятно.

Ytz>Велосипед собственного изготовления.


Я радикальных отличий от Буст.Лог не увидел.
По фичам выглядит по крайней мере точно так же.

Вот этого я вообще не понял:
LOG_IF(Warning, 1 < 2) << "Ok";

чем это лучше вот этого?
if (1 < 2) LOG(Warning) << "Ok";

Имхо, только хуже. Особенно если у тебя в условии найдутся запятые.

Ytz>P.S. А еще он вывод красиво раскрашивает

Кто? Где? Консольный вывод вставляет терминальные ЕSC-последовательности, что ли?
Так это и в бусте можно сделать:
http://boost-log.sourceforge.net/libs/log/doc/html/log/tutorial/formatters.html
 keywords::format = "[%TimeStamp%]: %_%"

вставляй в эту строчку что хочешь.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Ytz https://github.com/mtrempoltsev
Дата: 30.03.10 05:32
Оценка:
Уважаемый skeptik_! Поясните пожалуйста что смешного в моем коде. Мне в целях повышения профессионального уровня очень важна конструктивная критика коллег.
Re[7]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Ytz https://github.com/mtrempoltsev
Дата: 30.03.10 05:49
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Т.е. примеров "не такой радужности" не будет. Понятно.


Неужели вы считаете разумным изучить досконально документацию ради ответа на форуме? Я открыл документацию, посмотрел как например установить фильтр по уровню логирования:
void init()
{
logging::core::get()->set_filter
(
flt::attr< logging::trivial::severity_level >("Severity") >= logging::trivial::info
);
}
И понял, что это не соответствует моим представлениям о простоте.
И еще раз повторюсь, если вы хорошо знаете библиотеку, то пожалуйста напишите код который делает то же что и у меня. Возможно я не прав и Boost.Log действительно простая и удобная вещь.
Ytz>>P.S. А еще он вывод красиво раскрашивает
J>Кто? Где? Консольный вывод вставляет терминальные ЕSC-последовательности, что ли?
J>Так это и в бусте можно сделать:
J>http://boost-log.sourceforge.net/libs/log/doc/html/log/tutorial/formatters.html
J>
J> keywords::format = "[%TimeStamp%]: %_%"
J>

J>вставляй в эту строчку что хочешь.
Это под Unix консоль, причем не под каждой будет работать одинаково, не говоря уже о том, что под Windows работать не будет вообще.
Re[7]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: Ytz https://github.com/mtrempoltsev
Дата: 30.03.10 06:16
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>Вот этого я вообще не понял:

J>
J>LOG_IF(Warning, 1 < 2) << "Ok";
J>

J>чем это лучше вот этого?
J>
J>if (1 < 2) LOG(Warning) << "Ok";
J>

J>Имхо, только хуже. Особенно если у тебя в условии найдутся запятые.

Лучше тем, что писанины меньше и тем, что при сборке с отключенным логером условия не будут проверяться.
Re[8]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: jazzer Россия Skype: enerjazzer
Дата: 30.03.10 06:21
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, jazzer, Вы писали:


J>>Т.е. примеров "не такой радужности" не будет. Понятно.


Ytz>Неужели вы считаете разумным изучить досконально документацию ради ответа на форуме?

Ну изначально был не просто ответ на форуме, а ваше высказываение относительно этой библиотеки в целом.
Да, я считаю, что прежде чем высказываться относительно библиотеки, неплохо хотя бы документацию прочитать.

Ytz>Я открыл документацию, посмотрел как например установить фильтр по уровню логирования:


Ytz>void init()
Ytz>{
Ytz>    logging::core::get()->set_filter
Ytz>    (
Ytz>        flt::attr< logging::trivial::severity_level >("Severity") >= logging::trivial::info
Ytz>    );
Ytz>}

Если в вашем проекте именно этот фильтр так важен, то я не вижу проблем завернуть его в простейшую функцию
void min_log_level(XXX log_level)
{
    logging::core::get()->set_filter
    (
        flt::attr< logging::trivial::severity_level >("Severity") >= log_level
    );
}

и звать потом ее
void init()
{
  min_log_level( logging::trivial::info );
}

или писать такие обертки религия не позволяет?

Ytz>И еще раз повторюсь, если вы хорошо знаете библиотеку, то пожалуйста напишите код который делает то же что и у меня. Возможно я не прав и Boost.Log действительно простая и удобная вещь.

Нет, я ее не знаю, поэтому и воздерживаюсь от высказываний типа "не все радужно" или "все радужно" или "сорцы весят 900кб, поэтому без тестирования понятно, что тормоза".

Ytz>>>P.S. А еще он вывод красиво раскрашивает

J>>Кто? Где? Консольный вывод вставляет терминальные ЕSC-последовательности, что ли?
Ytz>Это под Unix консоль, причем не под каждой будет работать одинаково, не говоря уже о том, что под Windows работать не будет вообще.
понятия не имею, как раскрашивается консоль в винде.
В этом и состоит тайное знание, которого не заюзать в буст.лог?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: В boost утвердили логгер Boost.Log by Andrey Semashev
От: jazzer Россия Skype: enerjazzer
Дата: 30.03.10 06:26
Оценка: 1 (1)
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, jazzer, Вы писали:


J>>Вот этого я вообще не понял:

J>>
J>>LOG_IF(Warning, 1 < 2) << "Ok";
J>>

J>>чем это лучше вот этого?
J>>
J>>if (1 < 2) LOG(Warning) << "Ok";
J>>

J>>Имхо, только хуже. Особенно если у тебя в условии найдутся запятые.

Ytz>Лучше тем, что писанины меньше и тем, что при сборке с отключенным логером условия не будут проверяться.

Ну если это важно...
Так что насчет запятых?
Типа
LOG_IF(Warning, less_than< int, double >( 1, 2.0 )) << "Ok";
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.