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

Log record formatting

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

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

Возвращаясь к одному из примеров в предыдущих учебниках:

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

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

Формат может быть указан несколькими способами, как описано далее.

Lambda-style formatters

Вы можете создать форматер с таким выражением в стиле ягненка:

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",
        // This makes the sink to write log records that look like this:
        // 1: <normal> A normal severity message
        // 2: <error> An error severity message
        keywords::format =
        (
            expr::stream
                << expr::attr< unsigned int >("LineID")
                << ": <" << logging::trivial::severity
                << "> " << expr::smessage
        )
    );
}

См. полный код.

Здесь stream является держателем места для потока для форматирования записи в. Другие аргументы вставки, такие как attr и message, являются манипуляторами, которые определяют, что должно храниться в потоке. Мы уже видели severity помещика в фильтрующих выражениях, и здесь он используется в формате. Это хорошее объединение: вы можете использовать одни и те же держатели в фильтрах и форматах. attr держатель места похож на severity, поскольку он также представляет значение атрибута. Разница заключается в том, что severity держатель места представляет особый атрибут с именем «Северность» и типом trivial::severity_level и attr может быть использован для представления любого атрибута. В противном случае два владельца места эквивалентны. Например, можно заменить severity следующим:

expr::attr< logging::trivial::severity_level >("Severity")
[Tip]Tip

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

Есть и другие форматные манипуляторы, которые обеспечивают передовую поддержку для даты, времени и других типов. Некоторые манипуляторы принимают дополнительные аргументы, которые настраивают их поведение. Большинство из этих аргументов названы и могут быть переданы в стиле Boost.Parameter.

Для изменения давайте посмотрим, как это делается при ручном инициализации раковин:

void init()
{
    typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;
    boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();
    sink->locked_backend()->add_stream(
        boost::make_shared< std::ofstream >("sample.log"));
    sink->set_formatter
    (
        expr::stream
               // line id will be written in hex, 8-digits, zero-filled
            << std::hex << std::setw(8) << std::setfill('0') << expr::attr< unsigned int >("LineID")
            << ": <" << logging::trivial::severity
            << "> " << expr::smessage
    );
    logging::core::get()->add_sink(sink);
}

См. полный код.

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

Boost.Format-style formatters

В качестве альтернативы вы можете определить форматеры с синтаксисом, похожим на Boost.Format. Тот же формататор, как описано выше, может быть написан следующим образом:

void init()
{
    typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;
    boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();
    sink->locked_backend()->add_stream(
        boost::make_shared< std::ofstream >("sample.log"));
    // This makes the sink to write log records that look like this:
    // 1: <normal> A normal severity message
    // 2: <error> An error severity message
    sink->set_formatter
    (
        expr::format("%1%: <%2%> %3%")
            % expr::attr< unsigned int >("LineID")
            % logging::trivial::severity
            % expr::smessage
    );
    logging::core::get()->add_sink(sink);
}

См. полный код.

format держатель места принимает строку формата с позиционной спецификацией всех аргументов, отформатированных. Обратите внимание, что в настоящее время поддерживается только позиционный формат. Та же спецификация формата может использоваться с add_file_log и аналогичными функциями.

Specialized formatters

Библиотека предоставляет специализированные форматы для ряда типов, таких как дата, время и названный объем. Эти форматы обеспечивают расширенный контроль над форматированными значениями. Например, можно описать формат даты и времени с строкой формата, совместимой с Boost.DateTime:

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",
        // This makes the sink to write log records that look like this:
        // YYYY-MM-DD HH:MI:SS: <normal> A normal severity message
        // YYYY-MM-DD HH:MI:SS: <error> An error severity message
        keywords::format =
        (
            expr::stream
                << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S")
                << ": <" << logging::trivial::severity
                << "> " << expr::smessage
        )
    );
}

См. полный код.

Тот же форматер также может использоваться в контексте формата Boost.Format.

String templates as formatters

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

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",
        keywords::format = "[%TimeStamp%]: %Message%"
    );
}

См. полный код.

Здесь параметр формат принимает такой шаблон формата. Шаблон может содержать ряд хозяев, которые заключены с процентными знаками (%). Каждый держатель должен содержать имя атрибута для вставки вместо держателя места. %Сообщение% местоположений будет заменено регистратором лесозаготовок.

[Note]Note

Шаблоны текстового формата не принимаются назад поглотителями в методе set_formatter. Для того, чтобы разделить текстовый шаблон на функцию форматирования, нужно назвать функцию parse_formatter. Подробнее см. здесь.

Custom formatting functions

Вы можете добавить пользовательский форматировщик в раковину, которая поддерживает форматирование. Форматизатор на самом деле является функциональным объектом, поддерживающим следующую подпись:

void (logging::record_view const& rec, logging::basic_formatting_ostream< CharT >& strm);

Здесь CharT является целевым типом символов. Форматизатор будет использоваться всякий раз, когда просмотр записи журнала rec проходит фильтрацию и должен храниться в журнале.

[Tip]Tip

Рекордные взгляды очень похожи на записи. Примечательное различие заключается в том, что точка зрения неизменна и содержит неглубокую копию. Форматеры и раковины работают только на рекордных просмотрах, что мешает им изменять запись, в то время как она может быть все еще в использовании другими поглотителями в других резках.

Отформатированная запись должна быть составлена путем включения в STL-совместимый поток вывода strm. Вот пример пользовательского использования функции форматтера:

void my_formatter(logging::record_view const& rec, logging::formatting_ostream& strm)
{
    // Get the LineID attribute value and put it into the stream
    strm << logging::extract< unsigned int >("LineID", rec) << ": ";
    // The same for the severity level.
    // The simplified syntax is possible if attribute keywords are used.
    strm << "<" << rec[logging::trivial::severity] << "> ";
    // Finally, put the record message to the stream
    strm << rec[expr::smessage];
}
void init()
{
    typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;
    boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();
    sink->locked_backend()->add_stream(
        boost::make_shared< std::ofstream >("sample.log"));
    sink->set_formatter(&my_formatter);
    logging::core::get()->add_sink(sink);
}

См. полный код.


PrevUpHomeNext

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




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



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


реклама


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

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