Если верить С++ Next , логгер приняли в boost.
Ссылка на саму библиотеку здесь.
Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, ankorol, Вы писали: A>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".
Т.е. ежели некий инструмент решили таки присоединить к сборнику библиотек "boost", то это априори расставляет все точки над "Ё", давая этой тулзени бесспорное преимущество?
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, Rakafon, Вы писали:
R>Т.е. ежели некий инструмент решили таки присоединить к сборнику библиотек "boost", то это априори расставляет все точки над "Ё", давая этой тулзени бесспорное преимущество?
Нет, но популярности ей это точно придаст + кое-какие гарантии на качество.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, Rakafon, Вы писали:
R>Здравствуйте, ankorol, Вы писали: A>>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".
R>Т.е. ежели некий инструмент решили таки присоединить к сборнику библиотек "boost", то это априори расставляет все точки над "Ё", давая этой тулзени бесспорное преимущество?
Бесспорное преимущество не в Boost TM, а в том что его много где используют. Соответственно появление логгера в бусте избавит от необходимости изобретать велосипед, которые за пять лет работы для разных проектов мне приходилось изобретать уже раза три или четыре.
Re: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, ankorol, Вы писали:
A>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".
Нет не положит. Логирование должно быть настолько простым и незаметным, что-бы даже самый ленивый пользовался. Данный логгер этому требованию к сожалению не соответствует.
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, 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, Вы писали:
Ytz>На таком уровне конечно. Только это уровень std::cerr, логирование здесь еще даже не начинается, а вот дальше там уже все не так радужно.
Библиотека очень гибкая и настраиваемая, добится этого и при этом оставатся простой тяжело. В крайнем случае можно построить свой велосипед поверх Boost.Log но с настройками которые типичные для того или иного программиста и с удобным для него интерфейсом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: В boost утвердили логгер Boost.Log by Andrey Semashev
скачал исходники, аж 900кб для такой, как казалось бы простой вещи, как логер, более того сделан на стандартных стримах- тоесть даже без тестирования можно сказать что логер — тормоз(хотя конечно и подойдёт для 98% случаев).
Re[2]: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, Ytz, Вы писали:
Ytz>Здравствуйте, ankorol, Вы писали:
A>>Возможно это положит конец вопросам в этой ветке форума "Какой логгер выбрать?".
Ytz>Нет не положит. Логирование должно быть настолько простым и незаметным, что-бы даже самый ленивый пользовался. Данный логгер этому требованию к сожалению не соответствует.
Согласен, что никакого конца велосипедам не будет.
Я заметил, что все системы логирования имеют пагубную привычку использовать синглтоны в своей реализации и поощрять распространение логирующих операторов по всему коду, что вносит бардак и неконтролируемость. Любой логирующий фреймворк, основанный на шаблонах, обречен на неудачу, ибо он не предоставляет интерфейсов. Шаблоны делают код сильно связным, обращение к глобальным функциям логирования делает код нетестируемым и не реюзабельным. Интерфейсы же обеспечивают слабую связность бизнес кода и логирующего кода.
Для маленьких\средних приложений подход с глобальными функциями логирования действительно оправдан. Разработчиком не надо сильно пыхтеть, чтобы вывести в лог какую-то информацию, для форматирования тоже предоставлены необходимые хелперы (типа operator<<).
Однако при работе с большими приложениями уже начинается совсем другая история: при появлении динамических библиотек начинаются проблемы с синхронизацией тех самых синглтонов. Ибо в них настраиваются всякие фильтры и другая конфигурация. Появляются баги о том, что в логах появляются debug сообщения, хотя все отконфигурировано для фильтрации таких сообщений (а про длл мы иногда забываем)
появляются повышенные требования к логу:
должен быть локализован на 17 языков
должен содержать _осмысленную_ информацию для конечного пользователя. например, писать в логе "handle 319 was lost" нельзя писать для юзера и на это заводят баги. Юзер должен понимать по логу что же произошло, дабы не обращаться в суппорт.
нужно уметь менять уровни фильтрации через внешние ресурсы — файлы, реестр и тд в рантайме
нужно покрыть код юнит-тестами. даже факт логирования можно тестировать с помощью юнит-тестов
иногда в зависимости от сценария, юзеру требуется показывать или не показывать одну и ту же запись. то есть есть некий код, который что-то логирует. иногда требуется, чтобы он ничего не логировал и без нарушения OCP с помощью интерфейса мы могли бы решить эту проблему.
логи не должны корраптиться при падении приложения (либо восстанавливаться при запуске приложения)
появляются проблемы с логами на стрт-апе и выходе приложения, начинаются пляски вокруг порядка инициализации глобальных\статических объектов.
С помощью интерфейсов можно отключать логи у целой подсистемы (с помощью NullLogger) в рантайме. Аналогично, можно измерять влияние системы логирования на общий перформанс приложения. Опыт показывает, что все обращения с внешними ресурсами (реестр, базы данных, файлы) должны осуществляться через интерфейсы. К сожалению, мне не удалось еще поработать с подобной системой логирования, но мне кажется имеет смысл опробовать такой подход.
Кстати, логирование, вообще говоря, может иметь два вида: вид отладки и вид для конечного юзера. Надо уметь различать эти два типа. Иногда их называют трейсы и логи.
Трейс — это след в системе. Он не обязан быть локализован и вообще, к нему предъявляется мало требований. В трейсе могут фигурировать сущности из области решения (о которых пользователь может и не знать).
Лог же более строг: должен быть локализован и быть осмысленным. Это запись, оставленная пользователю и представляющая ценность для него. В этой записи фигурируют бизнес-объекты.
Re[4]: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, Ytz, Вы писали:
Ytz>На таком уровне конечно. Только это уровень std::cerr, логирование здесь еще даже не начинается, а вот дальше там уже все не так радужно.
Примеры "не такой радужности" будут? С указанием, как надо было сделать, если можно.
Здравствуйте, Ytz, Вы писали:
Ytz>Здравствуйте, jazzer, Вы писали:
J>>Примеры "не такой радужности" будут? С указанием, как надо было сделать, если можно. Ytz>Boost Log извините разбирать не хочу — страшно, но буду рад если покажете как просто сделать то же самое.
Т.е. примеров "не такой радужности" не будет. Понятно.
Ytz>Велосипед собственного изготовления.
Я радикальных отличий от Буст.Лог не увидел.
По фичам выглядит по крайней мере точно так же.
Уважаемый skeptik_! Поясните пожалуйста что смешного в моем коде. Мне в целях повышения профессионального уровня очень важна конструктивная критика коллег.
Re[7]: В boost утвердили логгер Boost.Log by Andrey Semashev
Здравствуйте, 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, Вы писали:
Ytz>Здравствуйте, jazzer, Вы писали:
J>>Т.е. примеров "не такой радужности" не будет. Понятно.
Ytz>Неужели вы считаете разумным изучить досконально документацию ради ответа на форуме?
Ну изначально был не просто ответ на форуме, а ваше высказываение относительно этой библиотеки в целом.
Да, я считаю, что прежде чем высказываться относительно библиотеки, неплохо хотя бы документацию прочитать.
Ytz>Я открыл документацию, посмотрел как например установить фильтр по уровню логирования:
или писать такие обертки религия не позволяет?
Ytz>И еще раз повторюсь, если вы хорошо знаете библиотеку, то пожалуйста напишите код который делает то же что и у меня. Возможно я не прав и Boost.Log действительно простая и удобная вещь.
Нет, я ее не знаю, поэтому и воздерживаюсь от высказываний типа "не все радужно" или "все радужно" или "сорцы весят 900кб, поэтому без тестирования понятно, что тормоза".
Ytz>>>P.S. А еще он вывод красиво раскрашивает J>>Кто? Где? Консольный вывод вставляет терминальные ЕSC-последовательности, что ли? Ytz>Это под Unix консоль, причем не под каждой будет работать одинаково, не говоря уже о том, что под Windows работать не будет вообще.
понятия не имею, как раскрашивается консоль в винде.
В этом и состоит тайное знание, которого не заюзать в буст.лог?
Здравствуйте, 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>Лучше тем, что писанины меньше и тем, что при сборке с отключенным логером условия не будут проверяться.
Ну если это важно...
Так что насчет запятых?
Типа