![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Log record formattingBoost , Chapter 1. Boost.Log v2 , Tutorial
|
![]() | Tip |
---|---|
Как показано в предыдущем разделе, можно определить помещики, такие как |
Есть и другие форматные манипуляторы, которые обеспечивают передовую поддержку для даты, времени и других типов. Некоторые манипуляторы принимают дополнительные аргументы, которые настраивают их поведение. Большинство из этих аргументов названы и могут быть переданы в стиле 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. Тот же формататор, как описано выше, может быть написан следующим образом:
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
и аналогичными функциями.
Библиотека предоставляет специализированные форматы для ряда типов, таких как дата, время и названный объем. Эти форматы обеспечивают расширенный контроль над форматированными значениями. Например, можно описать формат даты и времени с строкой формата, совместимой с 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.
В некоторых контекстах текстовые шаблоны принимаются в качестве форматеров. В этом случае используется код поддержки инициализации библиотеки для анализа шаблона и восстановления соответствующего форматера. Существует ряд оговорок, которые следует учитывать при использовании этого подхода, но здесь достаточно кратко описать формат шаблона.
void init() { logging::add_file_log ( keywords::file_name = "sample_%N.log", keywords::format = "[%TimeStamp%]: %Message%" ); }
Здесь параметр формат
принимает такой шаблон формата. Шаблон может содержать ряд хозяев, которые заключены с процентными знаками (%
). Каждый держатель должен содержать имя атрибута для вставки вместо держателя места. %Сообщение%
местоположений будет заменено регистратором лесозаготовок.
![]() | Note |
---|---|
Шаблоны текстового формата не принимаются назад поглотителями в методе |
Вы можете добавить пользовательский форматировщик в раковину, которая поддерживает форматирование. Форматизатор на самом деле является функциональным объектом, поддерживающим следующую подпись:
void (logging::record_view const& rec, logging::basic_formatting_ostream< CharT >& strm);
Здесь CharT
является целевым типом символов. Форматизатор будет использоваться всякий раз, когда просмотр записи журнала rec
проходит фильтрацию и должен храниться в журнале.
![]() | 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); }
Статья Log record formatting раздела Chapter 1. Boost.Log v2 Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |