1
0
mirror of https://github.com/romanlryji/EventLogLoader.git synced 2024-11-24 08:32:52 +02:00
1C:Enterprise 8 - Event log loader
Go to file
2017-01-07 13:01:26 -08:00
EventLogLoader WIP 2016-12-25 17:15:40 -08:00
EventLogLoaderManager UI changes 2016-12-29 14:21:40 -08:00
EventLogLoaderService bulk insert for MSSQL - works much faster! 2017-01-07 12:01:15 -08:00
.gitattributes Initial commit to add default .gitIgnore and .gitAttribute files. 2015-10-02 16:26:49 -07:00
.gitignore Initial commit to add default .gitIgnore and .gitAttribute files. 2015-10-02 16:26:49 -07:00
EventLogLoader.sln clean up 2016-12-25 13:12:43 -08:00
README.md Update README.md 2017-01-07 13:01:26 -08:00

Периодическая загрузка событий из журналов регистрации ИБ 1С:Предприятие 8 во внешнее хранилище (MS SQL Server, MySQL или ElasticSearch)

Основная страница приложения http://infostart.ru/public/182820/

Еще один вариант парсера файлов журнала регистрации для 1С:Предприятие 8.2/8.3. Преимущества:

  1. Читает журнал регистрации напрямую, что дает высокую скорость.
  2. Знает, где остановилось чтение в прошлый раз, и начинает с этого места при следующем запуске.
  3. Может работать и как windows-служба, и как обычное приложение.

Приложение написано на .NET 4.6.

В качестве источника данных может быть как старый (текстовый) формат журнала регистрации, так и новый (SQLite база данных). В качестве хранилища событий могут выступать MS SQL Server, MySQL и ElasticSearch.

Особенности работы

MS SQL Server

Строка соединения с хранилищем:
  • для windows-авторизации Data Source=MSSQL1;Server=имя сервера;Database=имя базы;Integrated Security=true;
  • для обычной авторизации Data Source=MSSQL1;Server=имя сервера;Database=имя базы;Password=Пароль;User ID=Имя пользователя
Запись событий в базу выполняется порциями по 1000 записей с помощью Bulk Insert.

MySQL

ElasticSearch

Строка соединения с хранилищем - protocol://servername:portname Например (если ES запущен на той же машине, где работает загрузчик): http://localhost:9200 Запись событий в базу выполняется порциями по 1000 записей с помощью Bulk Insert.

Порядок работы:

  1. На сервере MS SQL создать пустую базу данных.

  2. На сервере приложений 1С, из БД которого нужно грузить события, под административными правами запустить EventLogLoaderManager.exe

  3. Указать строку соединения с базой.

Можно использовать шаблоны: ;

  1. Указать интервал между циклами чтения событий из ЖР. Допустимо ставить несколько секунд - на производительности сервера не скажется.

  2. Отметить те БД, события из которых необходимо периодически загружать в базу.

  3. Нажать «Сохранить параметры», при этом в каталоге программы создается файл настроек setting.ini

  4. Если нужна периодическая загрузка – нажимаем «Установить службу», ищем в списке служб «EventLog loader service» и исправляем аккаунт, от имени которого будет работать служба. Если строка соединения содержит логин и пароль, то можно ничего не менять, если нет, то службу нужно запускать от имени правильной учетной записи windows, которая имеет полные права на SQL-базу с событиями.

  5. Если нужна разовая загрузка – запускаем из каталога программы EventLogLoader.exe. Следует учесть, что это приложение, как и служба, работает в бесконечном цикле (проверяет новые события, пишет их в базу, делает паузу, затем повторяет заново), поэтому прерывается она при нажатии любой кнопки мыши.

Некоторые особенности

  1.  Для каждой ИБ журнал регистрации грузится в отдельном потоке. Если начнете грузить по сотне баз, то велика вероятность на начальном этапе повесить сервер. В дальнейшем, если проверять новые события достаточно часто (например, каждые 10 секунд), то служба быстро их записывает в базу без особой загрузки сервера.
    
  2.  Если загрузку прервать, то при повторном запуске она продолжится с места остановки (позиция сохраняется в БД).
    
  3.  Таблицы в БД создаются автоматически. Если вы удалили какая-нибудь таблицу - надо перезапустить службу.
    
  4.  Все события по всем ИБ хранятся в одной таблице. Разделитель – колонка «Код информационной базы».
    
  5.  Логи с ошибками хранятся в каталоге программы в папке «log».
    
  6.  Работает только с платформой 8.2 (файлами lgf и lgp).
    
  7.  В таблицах созданы только основные кластерные индексы по полю "Код информационной базы". Для ускорения запросов, которые вам требуются регулярно, нужно добавлять свои индексы.
    
  8.  Несколько полей осталось нераспознанными (Field2, Field7, Field8). Если вам известно их назначение - сообщите, пожалуйста.
    

Описание таблиц

  1. Infobases - список обрабатываемых ИБ. Код генерируется автоматически при добавлении новой базы в этот список. Эти же коды определяют принадлежность записей в определенной ИБ во всех других таблицах.

  2. Params - хранит последние прочитанные файлы и позиции в них.

  3. Назначение остальных таблиц понятно из их названия. Итоговая таблица с событиями с присоединенными справочниками

SELECT TOP (1000) Infobases.Name, Events.DateTime, Events.TransactionStatus, Events.TransactionStartTime, Events.TransactionMark, Users.Name AS [User], Computers.Name AS Computer, Applications.Name AS App, Events.Field2, EventsType.Name AS EventType, Events.EventType, Events.Comment, Metadata.Name AS Metadata, Events.DataStructure, Events.DataString, Servers.Name AS [Server], MainPorts.Name AS MainPort, SecondPorts.Name AS SecondPort, Events.Seance FROM Events INNER JOIN Applications ON Events.InfobaseCode = Applications.InfobaseCode AND Events.AppName = Applications.Code INNER JOIN Computers ON Events.InfobaseCode = Computers.InfobaseCode AND Events.ComputerName = Computers.Code INNER JOIN EventsType ON Events.InfobaseCode = EventsType.InfobaseCode AND Events.EventID = EventsType.Code INNER JOIN Infobases ON Events.InfobaseCode = Infobases.Code INNER JOIN Users ON Events.InfobaseCode = Users.InfobaseCode AND Events.UserName = Users.Code INNER JOIN SecondPorts ON Events.InfobaseCode = SecondPorts.InfobaseCode AND Events.SecondPortID = SecondPorts.Code INNER JOIN Servers ON Events.ServerID = Servers.Code AND Events.InfobaseCode = Servers.InfobaseCode INNER JOIN MainPorts ON Events.InfobaseCode = MainPorts.InfobaseCode AND Events.MainPortID = MainPorts.Code INNER JOIN Metadata ON Events.InfobaseCode = Metadata.InfobaseCode AND Events.MetadataID = Metadata.Code

Объемы получаемой информации

Хранение структурированных данных более затратное с точки зрения требуемого места на дисках. Иными словами - объем базы данных будет существенно больше суммы объемов всех ЖР, которые были обработаны и загружены.

Реальный пример:

2 информационные базы с объемом ЖР 2132 Мб (1192+971). Время первичного разбора в 2 потока (т.к. базы 2) - около 1,5 часов.

Общее количество событий - 19'507'484 млн.

Объем базы на MS SQL Server - 12879 Мб, т.е. примерно в 6 раз больше!

НО - если применить сжатие таблиц, как, например, описано здесь, то получим 1610 Мб, т.е. даже меньше исходных данных. К сожалению, не все версии MS SQL Server поддерживают сжатие.