Всем привет!

Уже несколько недель собирался написать продолжение про srvrmgr, но никак не мог приступить. А сейчас вдруг появился интересный материал, про который захотелось написать сразу. Так что srvrmgr еще немного подождет, а сегодня разберем один интересный лайфхак, который я придумал сам!

Итак, передо мной и моими коллегами довольно часто стояла одна проблема. На самом деле не могу сказать, что она прям очень критичная, но тем не менее. Речь идет о поиске лог файлов. Как мы обычно это делаем (не знаю, может Вы делаете по-другому): мы знаем краткое название менеджера объектов приложения в котором идет работа. Мы заходим в приложение, выполняем там некие действия, а когда нам нужно найти лог, то мы его обычно ищем по части названия (имя компонента) и по его содержимому. Например, если в процессе работы с приложением мы искали какого-нибудь клиента, то мы ищем в тексте логов фамилию этого клиента. Что получается? Получается, что системе (или файловому менеджеру) приходится брать каждый лог файл, созданный для конкретного компонента, и просматривать весь его текст в поисках совпадения. Это очень долго и тяжело. Можно дополнительно ограничить поиск датой создания лог файла, но это все равно будет долго.

Что мне хотелось? Мне хотелось найти лог файл моментально. А для этого необходимо знать его точное название. Вот такую задачу я и начал решать. Весь процесс потока своих мыслей, проб и ошибок я изливать не буду, а дам Вам готовое решение, которые можно будет применить в своих проектах, если это покажется Вам действительно полезным.

Название лог файла состоит из двух частей: <имя_компонента>_<id_сессии>.log

Имя компонента довольно просто узнать. Сложнее получить id сессии, но и это вполне реально. Итак, информация о сессиях хранится в таблице S_SRM_TASK_HIST. Одно важное замечание: новые записи и обновление существующих записей происходит с запозданием в 50 секунд (потому у таблицы в названии есть HIST).  Создадим ряд объектов в репозитории:

  1. Создадим БК, основанный на таблице S_SRM_TASK_HIST. Назовем его, например Session BC
  2. Создадим БО, в который добавим наш новый БК. Назовем его Session BO
  3. Создадим БС сназванием Session Service, в котором реализуем два метода:

Ну и конечно добавим код в обработчики событий Service_PreCanInvokeMethod и Service_PreInvokeMethod.

Теперь у нас есть инструмент, позволяющий получить алертом id текущей сессии пользователя и целиком название лог файла.

Но нужно еще сделать так, чтобы этот сервис было удобно вызывать. Поэтому создадим еще ряд объектов:

  • Создадим объект с типом Command. Советую делать его через Wizard. Я назвал команду «About Session». В рамках ее создания нужно указать, что будет вызываться серверный метод, выбрать бизнес сервис и метод, который должен вызываться при выполнении данной команды

command_wiz

  • Доработаем объект с типом Menu и названием Generic WEB. Добавим новую запись Menu Item, в которой нужно прописать название команды (созданной выше), подпись (как это будет отображаться в выпадающем верхнем меню приложения) и позицию. Я сделал вот так:

menu_generic_web

Теперь компилируем все созданные и измененные объекты, заходим в приложение и видим новый пункт меню:

o_sessii

При желании для него можно еще и горячие клавиши сделать. Жмем на него (не забудьте о том, что нужно подождать 50 секнуд!) и…

sess_id

Теперь можно взять это название файла и за доли секунды его найти! А если еще эту штуку вписать в инструкцию пользователей и при появлении на продакшне каких-либо ошибок при заведении сбоя пользователи будут прикладывать скриншот с данной инфой, то работать станет во много раз проще!