Pull to refresh

Знакомство с библиотекой логирования Pantheios

Reading time5 min
Views5K
Всем так или иначе приходилось встраивать в свою программу систему логирования. Многие пишут свою, т.к. считают что умнее других её наиболее оптимальной. Другие же используют готовые библиотеки, которые могут сильно упростить жизнь.

Сегодня я хотел бы рассказать про библиотеку логирования Pantheios, которая обладает по заверению создателей большой скорость работы, мультипоточностью, поддержкой unicode и одновременного вывода в разные получатели логов.


Общие замечания


Я буду рассматривать логгер с т.з. использования на Windows, с компилятором что идет с Visual Studio 2010 SP1, с учетом того что логи хотелось бы иметь в UTF-16LE (в файле) и одновременно выводить в красках на консоль. Для меня также важно уметь выводить логи и на косоль в Unicode режиме, дабы поддерживать вывод в национальных алфавитах.

Статья написана в расчете на начинающих и для быстрого ознакомления с библиотекой.

Получение библиотеки




Сборка библиотеки


Итак, для сборки нам понадобится собственно исходные файлы pantheios и stlsoft.
Первые можно скачать с отсюда, а STLSoft STL отсюда.
Для определенности я брал самые последние доступные стабильные исходники версий pantheios-1.0.1-beta211 и stlsoft-1.9.108.

Распакуем полученные исходники в C:\temp и приступим к сборке.
Запустим консоль VS2010, где укажем переменную среды STLSOFT и запустим сборку:
>SET STLSOFT=c:\temp\stlsoft-1.9.108\
>cd C:\temp\pantheios-1.0.1-beta211\build\vc10
>nmake 2>&1 > out.log

и покурим пока всё соберется.

Результат будет находится в
c:\temp\pantheios-1.0.1-beta211\bin\ -- тесты
c:\temp\pantheios-1.0.1-beta211\lib\ -- сами библиотеки
c:\temp\pantheios-1.0.1-beta211\include\ -- include файлы


Если мельком глянуть в lib, то можно увидеть большое количество библиотек, собранных в разных режимах сборки.

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

Кратко об архитектуре


Библиотека фактически делится на четеры слоя:
  • Ядро
  • API для приложений
  • Front-end
  • Back-end


Ядро — связующая часть всех других частей библиотеки.
API для приложений — это как раз тот набор функций, которые мы можем использовать непосредственно для вывода в лог в своём приложении.
Front-end — подсистема, отвечающая за фильтрацию попыток вывода сообщений по уровню логирования.
Back-end — подсистема, которая отвечает за вывод сообщений в конкретный получатель (файл, консоль, syslog и т.д.), а также за настройку этого получателя (формат вывода например).

Подробнее об архитектуре можно прочитать на страничке: самого проекта.

Тестирование работы


Доопределим переменные среды следующим образом и запустим VS2010:
>set PANTHEIOS_ROOT=c:\temp\pantheios-1.0.1-beta211\
>set STLSOFT=c:\temp\stlsoft-1.9.108\
>devnev.exe


Создадим стандартный C++ Console Project и сконфигурируем проект так, чтобы он смог видеть нашу библиотеку через переменные среды:




Пришло время занятся собственно написание теста.
Как мы помним, ранее ставилась задача: вывод одновременно в лог и на красочную консоль в UTF-16.

Для этих целей мы с вами должны использовать два Back-End-а: косноль и файл. И бэк и фронт энды могут быть подключены к прорамме используя приготовленные заранее include файлы. Это сильно упрощает настройку логирования.

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


Собственно на скриншете как раз и выставлены нужные нам опции.
Кратко поясню:
  • блок Front-end а задает «простой front-end» — это фронт энд «fe.simple» который ничего не фильтрует по уровню записи в лог.
  • блок Back-end-а задает бэк-енд «be.lrsplit», который разбивает входящий поток сообщений на два: file и Windows Console.

Остальное, думаю, интуитивно понятно.

Ок, теперь мы можем скопировать и исправить то что нам нагенерировала утилита (да, она ошиблась в выборе be.ltsplit-а как раз, вероятно файл, где он содержался переназвали, что не учли в утилите). Также мы должны дополнить include-ы непосредственно указанием ядерных.

В итоге получим такие файлы:

#include <pantheios/pantheios.hpp>
#include <pantheios/inserters/args.hpp>
#include <pantheios\backends\bec.file.h>

#include <pantheios/implicit_link/core.h>
#include <pantheios/implicit_link/util.h>
#include <pantheios/implicit_link/fe.simple.h>
#include <pantheios/implicit_link/be.lrsplit.h>
#include <pantheios/implicit_link/bel.file.h>
#include <pantheios/implicit_link/ber.WindowsConsole.h>


Теперь надо учесть, что fe.simple требует доопределения имени приложения (для индикации в лог файле).
Для этого объвим переменную:
extern "C" const TCHAR PANTHEIOS_FE_PROCESS_IDENTITY[] = L"MyMegaLogger";


Ну и собственно теперь реализуем наш тест:
void testfoo(void*)
{
	for(int i=0;i<10;++i)
	{
		try
		{

			pantheios::log_DEBUG(TEXT("Привет, русский язык в UTF16?"));

			pantheios::log_DEBUG(TEXT("debug"));
			pantheios::log_INFORMATIONAL(TEXT("informational"));
			pantheios::log_NOTICE(TEXT("notice"));
			pantheios::log_WARNING(TEXT("warning"));
			pantheios::log_ERROR(TEXT("error"));
			pantheios::log_CRITICAL(TEXT("critical"));
			pantheios::log_ALERT(TEXT("alert"));
			pantheios::log_EMERGENCY(TEXT("EMERGENCY"));
		}
		catch(std::bad_alloc&)
		{
			pantheios::log_ALERT(TEXT("out of memory"));
		}
		catch(std::exception& x)
		{
			pantheios::log_CRITICAL(TEXT("Exception: "), x);
		}
		catch(...)
		{
			pantheios::logputs(pantheios::emergency, TEXT("Unexpected unknown error"));
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	pantheios::log(pantheios::debug, TEXT("Entering main("), 
		pantheios::args(argc, argv, pantheios::args::arg0FileOnly), TEXT(")"));
	pantheios_be_file_setFilePath(TEXT("local.log"), 
		PANTHEIOS_BE_FILE_F_TRUNCATE, 
		PANTHEIOS_BE_FILE_F_TRUNCATE, 
		PANTHEIOS_BEID_LOCAL);

	for(int i=0;i<5;++i){
		_beginthread(testfoo, 0, NULL);
	}

	std::cin.get();
	return EXIT_SUCCESS;

}


и получить результат:


и аналогичный (но без цвета) в файле local.log.

Заключение


Мы рассмотрели совсем базовую часть логера pantheios, но в нём еще много интересного.
Из плюсов можно выделить скорость работы, поддержку unicode «из коробки», кросплатформенность, type-safe-инг.
Из минусов я бы выделил достаточно запутанную процедуру использования и неподдержку конфигурирования из файла. Впрочем, зачастую, на эти минусы можно не обращать внимание.

За бортом осталось сравнение с другими логгерами, advanced конфигурирование (формат вывода), быть может это появится в другой заметке.

Спасибо дочитавшим до конца и удачных выходных!
Tags:
Hubs:
+13
Comments20

Articles