Работа с журналом регистрации. Выходим за границы платформы
Работа с журналом регистрации нестандартными средствами. А также немного про использование платформы .NET в экосистеме 1С.
- Описание
- Подробнее
Описание
Начнем
Стандартный журнал регистрации платформы 1С имеет относительно большие возможности по записи информации о событиях в информационной базе. Эта информация может быть полезной при диагностике работы системы, расследования причин изменения данных в базе и многих других случаев.
Работать с журналом регистрации можно как встроенными в платформу инструментами, так и с помощью обработок из подсистем БСП. Также можно использовать нестандартные инструменты, например отчет "Просмотр и анализ журнала регистрации (отчет на СКД)".
Все было бы хорошо, но есть одна проблема. При большом размере данных в журнале работа с ним превращается в настоящий кошмар. Поиск данных в нем может занимать длительное время, причем не всегда можно дождаться результата. При получении данных из журнала и поиске необходимой информации могут появляться критически проблемы производительности в работе сервера 1С вплоть до его полного зависания, как это не раз уже освещалось на Инфостарт.
Есть несколько путей решения этих проблем:
- Не использовать его. Это не наш путь, но если он Вам не нужен — тогда это идеальное решение. При этом встречался со случаями, когда вместо него создавали регистры сведений и записывали нужные данные туда. Не будем касаться этой темы, у нее есть свои плюсы и минусы.
- Выгружать данные журнала в отдельную базу средствами платформы 1С. Создаем регламентное задание (а может и не одно) для выгрузки данных в какую-либо внешнюю базу. Решение рабочее и может функционировать весьма эффективно. Главными недостатками являются: недостаточная производительность при большом объеме данных, влияние на рабочий сервер 1С (иногда значительное), а также потенциально большой лаг по времени выгрузки.
- Использовать регулярные выражения для поиска данных. Для этого переводим формат журнала в текстовый и парсим его с помощью регулярных выражений. Производительность на высоте, но вот сопровождение такого решения требует значительных трудозатрат. К тому же отдать такое в использование рядовым пользователям тоже не просто.
Сегодня мы коснемся немного другого пути работы с журналом регистрации, в котором задействуем средства платформы .NET.
Не первое решение
Еще в далеком 2013 году (уже 7 лет прошло!) Алексей Бочков предложил решение для сообщества в виде приложения "EventLogLoader" на Visual Basic, которое напрямую парсит файлы (для старого формата журнала регистрации) или получает данные из SQLite-базы журнала (для нового формата) После отправляет в одно из возможных хранилищ данных (база SQL Server, MySQL или индекс ElasticSearch).
В статье "Периодическая загрузка событий из журналов регистрации в базу MS SQL Server (с исходниками)" дано описание работы инструмента и, судя по статистике, он пользуется некоторой востребованностью.
В этой статье будет предложено фактически то же решение по прямому чтению данных из файлов журнала регистрации, но в несколько другом виде. Поехали!
Пройдемте в библиотеку
Чем же отличается предлагаемое решение от того, что было сделано столько лет назад? Главными особенностями будут следующие:
- Это библиотеки с открытым исходным кодом (лицензия MIT), поставляемые в виде Nuget-пакетов. Но никто не мешает взять их в виде исходного кода из репозиториев на GitHub. Подчеркиваю, это библиотеки, а не готовое приложение. Конечно, в репозитории есть примеры консольных приложений, но вряд ли они могут подойти всем и потребуют адаптации, но использовать их никто не запрещает.
- Реализованы на базе платформе .NET Core с использованием языка C#.
- Чтение и выгрузка данных реализованы в отдельных библиотеках, что позволяет использовать их отдельно в зависимости от задач.
- Возможность расширять стандартные возможности библиотеки экспорта, добавляя новые хранилища.
- Изначально готов функционал выгрузки в базы данных SQL Server и PostgreSQL.
Далее пройдемся по каждой библиотеке. И сейчас будет неожиданное — листинги кода C#!
Помощник чтения данных журнала регистрации
Библиотека "YY.EventLogReaderAssistant" позволяет читать данные файлов журнала регистрации как старого текстового формата (*.lgf, *.lgp), так и нового формата SQLite-базы (*.lgd). На следующем листинге продемонстрирован простой пример ее использования в виде консольного приложения.
private static int _eventNumber = 0;
static void Main(string[] args)
{
if (args.Length == 0)
return;
// Каталог хранения файлов журнала регистрации.
// Может быть указан конкретный файл журнала (*.lgd / *.lgf)
string dataDirectoryPath = args[0];
Console.WriteLine($"{DateTime.Now}: Инициализация чтения логов \"{dataDirectoryPath}\"...");
// Инициализация объекта чтения логов
using (EventLogReader reader = EventLogReader.CreateReader(dataDirectoryPath))
{
// Устанавливаем обработчики событий
reader.AfterReadEvent += Reader_AfterReadEvent;
reader.AfterReadFile += Reader_AfterReadFile;
reader.BeforeReadEvent += Reader_BeforeReadEvent;
reader.BeforeReadFile += Reader_BeforeReadFile;
reader.OnErrorEvent += Reader_OnErrorEvent;
// Выводим общее количество событий
Console.WriteLine($"{DateTime.Now}: Всего событий к обработке: ({reader.Count()})...");
Console.WriteLine();
Console.WriteLine();
// Последовательно читаем все события журнала
while (reader.Read())
{
// reader.CurrentRow - данные текущего события
_eventNumber += 1;
}
}
Console.WriteLine($"{DateTime.Now}: Для выхода нажмите любую клавишу...");
Console.ReadKey();
}
Тут все просто. Создаем экземпляр класса "EventLogReader", передав путь к каталогу с файлами данных журнала регистрации. Далее подписываемся на события:
- После чтения файла (AfterReadFile)
- После чтения события (AfterReadEvent)
- Перед чтением события (BeforeReadEvent)
- Перед чтением файла (BeforeReadFile)
- При ошибке (OnErrorEvent)