![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Detailed features descriptionBoost , Chapter 1. Boost.Log v2 , Chapter 1. Boost.Log v2
|
![]() | Tip |
---|---|
Следует сказать, что все методы регистрации ядра являются безвредными в многопоточной среде. Однако это может быть неверно для других компонентов, таких как итераторы или наборы атрибутов. |
Можно приобрести копию всего набора атрибутов (глобального или нитевидного) или установить его в ядро. Методыget_global_attributes
,set_global_attributes
,get_thread_attributes
иset_thread_attributes
служат этой цели.
![]() | Warning |
---|---|
После установки целого набора атрибутов в ядро все итераторы, которые ранее были возвращены соответствующими |
Глобальная фильтрация обрабатывается объектом функции фильтра, который может быть обеспечен методомset_filter
. Более подробная информация о создании фильтров содержится вэтом разделе. Здесь достаточно будет сказать, что фильтр принимает набор значений атрибутов и возвращает булево значение, которое сообщает, прошла ли запись журнала с этими значениями атрибутов фильтрацию или нет. Глобальный фильтр применяется к каждой записи журнала, сделанной во всем приложении, поэтому его можно использовать для быстрого уничтожения чрезмерных записей журнала.
Глобальный фильтр может быть удален методомreset_filter
. Когда в ядре нет фильтра, предполагается, что никакие записи не отфильтровываются. Это дефолт после первоначального строительства лесозаготовительного ядра.
enum severity_level { normal, warning, error, critical }; void foo() { boost::shared_ptr< logging::core > core = logging::core::get(); // Set a global filter so that only error messages are logged core->set_filter(expr::attr< severity_level >("Severity") >= error); // ... }
Ядро также предоставляет еще один способ отключить лесозаготовку. Позвонивset_logging_enabled
с булевым аргументом, можно полностью отключить или повторно включить журналирование, включая применение фильтрации. Отключение регистрации с помощью этого метода может быть более полезным с точки зрения производительности приложения, чем установка глобального фильтра, который всегда выходит из строя.
После того, как применяется глобальная фильтрация, поглотители журналов вступают в действие. Для добавления и удаления поглотителей ядро обеспечиваетспособ add_sink
испособ remove_sink
. Оба этих метода принимают указатель на раковину.add_sink
добавит раковину в ядро, если она еще не добавлена. Способremove_sink
будет искать предоставленную раковину во внутреннем списке ранее добавленных раковин и удалять раковину, если она найдет ее. Порядок, в котором основные процессы погружаются внутрь, не определен.
void foo() { boost::shared_ptr< logging::core > core = logging::core::get(); // Set a sink that will write log records to the console boost::shared_ptr< sinks::text_ostream_backend > backend = boost::make_shared< sinks::text_ostream_backend >(); backend->add_stream( boost::shared_ptr< std::ostream >(&std::clog, boost::null_deleter())); typedef sinks::unlocked_sink< sinks::text_ostream_backend > sink_t; boost::shared_ptr< sink_t > sink = boost::make_shared< sink_t >(backend); core->add_sink(sink); // ... // Remove the sink core->remove_sink(sink); }
Подробнее о конструкции раковин можно прочитать в следующих разделах:Sink FrontendsиSink Backends.
Ядро обеспечивает способ централизованной обработки исключений. Если исключение происходит во время фильтрации или обработки в одной из добавленных раковин, ядро вызовет обработчик исключений, если он был установлен методомset_ Exception_handler
. Обработчик исключений представляет собой объект нулевой функции, который вызывается из пунктаулова
. Библиотека предоставляетинструментыдля упрощения построения обработчиков исключений.
![]() | Tip |
---|---|
Обработчик исключений в ядре регистрации является глобальным и, таким образом, предназначен для выполнения некоторых общих действий по ошибкам. Лесозаготовительные поглотители и источники также предоставляют средства обработки исключений (см.здесьиздесь), которые могут использоваться для более тонкой обработки зернистых ошибок. |
struct my_handler { typedef void result_type; void operator() (std::runtime_error const& e) const { std::cout << "std::runtime_error: " << e.what() << std::endl; } void operator() (std::logic_error const& e) const { std::cout << "std::logic_error: " << e.what() << std::endl; throw; } }; void init_exception_handler() { // Setup a global exception handler that will call my_handler::operator() // for the specified exception types logging::core::get()->set_exception_handler(logging::make_exception_handler< std::runtime_error, std::logic_error >(my_handler())); }
Одной из наиболее важных функций лесозаготовительного ядра является обеспечение точки входа для всех источников лесозаготовок для подачи записей журналов. Это делается с помощью методовopen_record
иpush_record
.
Первый метод используется для инициирования процесса регистрации записей. Он принимает исходный набор атрибутов. Метод конструирует общий набор значений атрибутов трех наборов атрибутов (глобальных, нитевидных и исходных) и применяет фильтрацию. Если фильтрация удалась, т.е. по меньшей мере одна раковина принимает запись с этими значениями атрибутов, способ возвращает непустыйобъект записи, который может быть использован для заполнения сообщения записи журнала. Если фильтрация не удалась, возвращается пустой объект записи.
Когда источник журнала готов завершить процедуру регистрации, он должен вызвать методpush_record
с записью, возвращенной методомopen_record
. Обратите внимание, что не следует звонитьpush_record
с пустой записью. Запись должна быть принята в качестве ссылки на значение r. Во время вызова вид записи будет построен из записи. Затем вид будет передан раковинам, которые приняли его во время фильтрации. Это может включать в себя форматирование записи и дальнейшую обработку, например, хранение ее в файл или отправку по сети. После этого рекордный объект может быть уничтожен.
void logging_function(logging::attribute_set const& attrs) { boost::shared_ptr< logging::core > core = logging::core::get(); // Attempt to open a log record logging::record rec = core->open_record(attrs); if (rec) { // Ok, the record is accepted. Compose the message now. logging::record_ostream strm(rec); strm << "Hello, World!"; strm.flush(); // Deliver the record to the sinks. core->push_record(boost::move(rec)); } }
Вся эта логика обычно скрыта в лесозаготовителях и макросах, предоставленных библиотекой. Однако это может быть полезно для тех, кто разрабатывает новые источники журналов.
Статья Detailed features description раздела Chapter 1. Boost.Log v2 Chapter 1. Boost.Log v2 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 1. Boost.Log v2 ::
реклама |