В системе Ultima Businessware® реализовано центральное структурированное журналирование на базе библиотеки Serilog (
http://serilog.net/):
•встроенный в систему анализатор логов "Log viewer", описанный ниже, работает только с базой данных MongoDB и подразумевает конкретную структуру документов-событий, генерируемую библиотекой Serilog;
•запуск и настройка MongoDB описаны в разделе Аппаратный комплекс;
•настройки приложений для журналирования с использованием Serilog описана там же;
•по умолчанию системой журналируются:
▪все SQL-запросы, для них в лог пишутся: время, текст, параметры, транзакция и серверный вызов;
▪все исключения на момент возникновения – FirstChanceException. Необходимость этого обусловлена тем, что сервер приложений не всегда действует от имени клиента. В заданиях, обратных вызовах и явно созданных потоках может возникнуть исключение, которое приведет к прекращению работы сервера и не будет транслировано клиенту. Чтобы эта информация не потерялась и необходимо журналирование всех исключений;
▪любой оператор throw. По этой причине в логе можно увидеть даже исключения, которые чем-то перехватываются и не видны конечному пользователю;
•журналирование остальных событий должно быть инициализировано прикладным разработчиком. Это делается через интерфейсы ILogger и ILogManager, описанные в документации разработчика в разделе "Инструментарий разработчика / Скрипты / Специальные менеджеры".
Командой "View logs" открывается форма просмотра событий "Log viewer":
•Mongo DB connection string – адрес базы в формате: mongodb://127.0.0.1:27017; •User name и Password – для каждого пользователя в MongoDB создается своя учетная запись с правами на чтение логов; •Limit loaded entries to – ограничение на количество отображаемых в форме событий; •Timeout – период ожидания в секундах отклика от базы. |
На закладке "Filter" осуществляется фильтрация отображаемых в форме событий.
При журналировании к событиям автоматически добавляются свойства контекста выполнения, как-то: код пользователя, идентификатор транзакции, текущего вызова и сессии. По коду сессии удобно отслеживать все события, которые произвел в системе некий конкретный пользователь в заданный промежуток времени. По идентификатору вызова можно выяснить, какие SQL-запросы были выполнены в течение некоего серверного вызова, и так далее.
На закладке "Query" приведен запрос на JSON к базе Mongo, который генерируется согласно настройкам фильтра за закладке "Filter". При необходимости можно писать произвольные запросы к хранилищу, изменив данный запрос вручную.
Запросы в Mongo формулируются в виде документов-образцов. В образце указываются либо значения интересующих полей (например, Level: Debug), либо специальные операторы сравнения ($in, $gt, $gte, $lt, $lte, $regex и так далее). Чтобы ограничить значения вложенного документа (скажем, Properties.UserID), используется точечная нотация. Более подробно тема освещена в документации к MongoDB.
Отфильтрованный список событий выводится в правой части формы. События отсортированы по убыванию даты. Список уже выведенных событий можно дополнительно фильтровать, в том числе и с использованием регулярных выражений (подробное описание синтаксиса которых можно найти на сайте MSDN
eng/rus), в строке поиска
в верхней части формы. Данный фильтр применяется нажатием кнопки "
Refresh":
События каждого уровня важности Logging level предваряются в списке соответствующей иконкой:
– уровень Verbose;
– уровень Debug;
– уровень Information;
– уровень Warning;
– уровень Error;
– уровень Fatal.
Справа в секции "Logging" отображаются свойства выбранного в списке события, которые могут иметь сложную древовидную структуру: исключения сохраняются вместе со вложенными исключениями и набором свойств Data. Снизу – подробная информация о выбранном в списке событии:
•на закладке "Rendered message" – текстовое описание события;
•на закладке "Exception call stack" – стек вызовов исключения;
•на закладке "Json document" – JSON-представление события.