Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Setting up sinks

Boost , Chapter 1. Boost.Log v2 , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Иногда банальная вырубка не обеспечивает достаточной гибкости. Например, может потребоваться более сложная логика обработки журналов, а не просто печать на консоли. Чтобы настроить это, вы должны построить лесозаготовительные раковины и зарегистрировать их с лесозаготовительным ядром. Обычно это должно быть сделано только один раз в коде запуска вашего приложения.

[Note]Note

Надо отметить, что в предыдущих разделах мы не инициализировали ни одной раковины, а тривиальные рубки как-то сработали. Это потому, что библиотека содержитпо умолчанию.раковина, которая используется в качестве запасного варианта, когда пользователь не установил раковины. Эта раковина всегда печатает записи журналов на консоли в фиксированном формате, который мы видели в наших предыдущих примерах. По умолчанию раковина в основном предоставляется для того, чтобы можно было сразу использовать тривиальные журналы, без какой-либо инициализации библиотеки. После того, как вы добавите любые раковины в ядро лесозаготовки, раковина по умолчанию больше не будет использоваться. Тем не менее, вы все равно сможете использовать тривиальные макросы.

File logging unleashed

В качестве отправной точки, вот как вы могли бы инициализировать запись в файл:

void init()
{
    logging::add_file_log("sample.log");
    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}

В этом случае он будет выполнять функцию<add_file_log>. Как следует из названия, функция инициализирует логарифмическую раковину, которая хранит записи журнала в текстовый файл. Функция также принимает ряд опций настройки, таких как интервал вращения файла и пределы размера. Например:

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",                                        1
        keywords::rotation_size = 10 * 1024 * 1024,                                   2
        keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), 3
        keywords::format = "[%TimeStamp%]: %Message%"                                 4
    );
    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}

1

имя файла

2

Каждые 10 миб...

3

Или в полночь

4

формат записи журнала

См. полный текст.

Вы можете видеть, что опции передаются функции в названной форме. Такой подход применяется и во многих других местах библиотеки. Ты привыкнешь к этому. Значение параметров в основном самоочевидно и задокументировано в этом руководстве (см.здесь, что касается раковины текстового файла). Эта и другие функции инициализации удобств описаны вэтомразделе.

[Note]Note

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

Sinks in depth: More sinks

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

В простейшей форме вызов функции<add_file_log>в разделе выше почти эквивалентен этому:

void init()
{
    // Construct the sink
    typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;
    boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();
    // Add a stream to write log to
    sink->locked_backend()->add_stream(
        boost::make_shared< std::ofstream >("sample.log"));
    // Register the sink in the logging core
    logging::core::get()->add_sink(sink);
}

См. полный текст.

Хорошо, первое, что вы, возможно, заметили в раковинах, это то, что они состоят из двух классов: frontend и backend. Фронтенд (который является шаблоном класса<synchronous_sink>в фрагменте выше) отвечает за различные общие задачи для всех раковин, такие как модель синхронизации потоков, фильтрация и, для текстовых раковин, форматирование. Бэкэнд (класс<text_ostream_backend>выше) реализует все, что относится к раковине, например, запись в файл в этом случае. Библиотека предоставляет ряд интерфейсов и бэкэндов, которые могут использоваться друг с другом из коробки.

Шаблон класса<synchronous_sink>выше указывает, что раковина синхронна, то есть позволяет одновременно входить в систему нескольким потокам и будет блокироваться в случае спора. Это означает, что бэкэнду<text_ostream_backend>вообще не нужно беспокоиться о многопоточности. Есть и другие фронтенды раковины, вы можете прочитать больше о нихздесь.

Класс<text_ostream_backend>записывает форматированные записи журналов в STL-совместимые потоки. Мы использовали поток файлов выше, но мы могли использовать любой тип потока. Например, добавление вывода на консоль может выглядеть следующим образом:

#include <boost/core/null_deleter.hpp>
// We have to provide an empty deleter to avoid destroying the global stream object
boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter());
sink->locked_backend()->add_stream(stream);

<text_ostream_backend>поддерживает добавление нескольких потоков. В этом случае его выход будет дублирован на все добавленные потоки. Полезно дублировать вывод на консоли и файл, так как вся фильтрация, форматирование и другие накладные расходы библиотеки происходят только один раз за запись для раковины.

[Note]Note

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

Библиотека предоставляет несколькобэкэндов, которые обеспечивают различную логику обработки журналов. Например, указывая серверsyslog, вы можете отправлять записи журналов по сети на сервер syslog или настраивая. Журнал событий Windows NTbackend позволяет отслеживать время работы приложения с помощью стандартных инструментов Windows.

Последнее, что стоит отметить, это вызов функции<locked_backend>для доступа к задней панели раковины. Он используется для получения потокового безопасного доступа к бэкэнду и предоставляется всеми фронтендами раковины. Эта функция возвращает умный указатель на бэкэнд и до тех пор, пока он существует, бэкэнд заблокирован (что означает, что даже если другая нить пытается войти в систему и запись журнала передается в раковину, она не будет зарегистрирована, пока вы не отпустите бэкэнд). Единственным исключением является интерфейс<unlocked_sink>, который вообще не синхронизируется и просто возвращает разблокированный указатель на бэкэнд.


PrevUpHomeNext

Статья Setting up sinks раздела Chapter 1. Boost.Log v2 Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:43:43/0.027781963348389/1