![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Creating loggers and writing logsBoost , Chapter 1. Boost.Log v2 , Tutorial
|
![]() | Note |
---|---|
Любопытный читатель мог заметить, что мы не создавали лесорубов для тривиальных рубок. Фактически лесоруб предоставляется библиотекой и используется за кулисами. |
В отличие от поглотителей, источники не должны быть зарегистрированы где-либо, поскольку они взаимодействуют непосредственно с лесозаготовительным ядром. Также обратите внимание, что в библиотеке есть две версии регистраторов: нити-безопасные и ненити-безопасные. Для непоточно-безопасных регистраторов безопасно для разных потоков записывать журналы через различные экземпляры регистраторов, и, таким образом, для каждого потока, который записывает журналы, должен быть отдельный регистратор. Доступ к ним можно получить из разных потоков одновременно, но это будет включать блокировку и может замедлить работу в случае интенсивной регистрации. В их названии есть суффикс<_mt
>.
Независимо от безопасности потока, все регистраторы, предоставляемые библиотекой, являются по умолчанию и могут копировать и поддерживать замену, поэтому не должно быть никаких проблем в том, чтобы сделать регистратор членом вашего класса. Как вы увидите позже, такой подход может дать вам дополнительные преимущества.
Библиотека предоставляет ряд регистраторов с различными функциями, такими как серьезность и поддержка каналов. Эти функции можно комбинировать друг с другом, чтобы построить более сложные лесозаготовители. См.здесьдля более подробной информации.
Если вы не можете поместить регистратора в свой класс (если у вас его нет), библиотека предоставляет способ объявления глобальных регистраторов следующим образом:
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, src::logger_mt)
Здесь<my_logger
>- это определяемое пользователем имя тега, которое будет использоваться позже для извлечения экземпляра регистратора, и<logger_mt
>- тип регистратора. Любой тип регистратора, предоставленный библиотекой или определенный пользователем, может участвовать в таком заявлении. Однако, поскольку у регистратора будет один экземпляр, вы, как правило, захотите использовать регистраторы с защитой потока в многопоточном приложении в качестве глобальных.
Позже вы можете приобрести лесоруб, как это:
src::logger_mt& lg = my_logger::get();
<lg
>будет относиться к одному и единственному экземпляру регистратора на протяжении всей заявки, даже если приложение состоит из нескольких модулей. Сама функция<get
>безопасна для потоков, поэтому нет необходимости в дополнительной синхронизации вокруг нее.
Независимо от того, какой регистратор вы используете (член класса или глобальный, безвредный или нет), чтобы записать запись журнала в регистратор, вы можете написать что-то вроде этого:
logging::record rec = lg.open_record(); if (rec) { logging::record_ostream strm(rec); strm << "Hello, World!"; strm.flush(); lg.push_record(boost::move(rec)); }
Здесь вызов функции<open_record
>определяет, будет ли построенная запись потребляться по меньшей мере одной раковиной. На этом этапе применяется фильтрация. Если запись потребляется, функция возвращает действительный объект записи, и можно заполнить строку сообщения записи. После этого запись может быть завершена с вызовом<push_record
>.
Конечно, вышеупомянутый синтаксис можно легко обернуть в макрос и, по сути, пользователям рекомендуется писать свои собственные макросы вместо непосредственного использования интерфейса регистратора C++. Запись выше может быть написана следующим образом:
BOOST_LOG(lg) << "Hello, World!";
Выглядит немного короче, не так ли? Макро<BOOST_LOG
>, наряду с другими подобными, определяется библиотекой. Он автоматически обеспечивает STL-подобный поток для форматирования сообщения с обычными выражениями вставки. После написания, компилирования и выполнения кода вы сможете увидеть запись «Hello, World!» в файле «sample.log». Полный текст этого разделавы найдете здесь.
Статья Creating loggers and writing logs раздела Chapter 1. Boost.Log v2 Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |