Каталог решений - Инструменты экспорта журнала регистрации 1С в ClickHouse/ElasticSearch

Инструменты экспорта журнала регистрации 1С в ClickHouse/ElasticSearch

Инструменты экспорта журнала регистрации 1С в ClickHouse/ElasticSearch

В наличии

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

Категория:

Описание

Удалил релизы инструментов, которые были выложены здесь. Все последующие обновления и справочная информация обновляются и доступны только на странице репозитория. Оставлю эту статью как анонс.

Реализована работа только с файловым форматом журнала (lgp и lgf).

В публикации описаны инструменты для 2 СУБД:

  • ElasticSearch
  • ClickHouse

Я в своей ежедневной работе остановился на связке ClickHouse + Redash для визуализации данных (за что отдельное спасибо Юрию, сам бы не добрался посмотреть ее:)).

Для работы с ElasticSearch достаточно лишь установленного экземпляра ноды и Kiban`ы для визуализации.

Приложения работают в "Live" режиме, автоматически отслеживая появление/удаление файлов журнала и продолжая работать с последней позиции файла после перезапуска службы. Написаны на C# (net standard 2.1, net 5). Исходный код всех приложений открыт под лицензией MIT и может использоваться Вами как угодно. 

Репозиторий на Github состоит из нескольких проектов, вершиной айсберга которых является служба EventLogExporter.

 Ну, приступим.

Состав репозитория:

  • OneSTools.EventLog — Библиотека для чтения журнала регистрации (старый формат, LGF и LGP файлы). Позволяет выполнять как разовое чтение данных, так и запуск в "live" режиме
  • OneSTools.EventLog.Exporter.Core — Библиотека-ядро для инструментов экспорта журнала регистрации, на основе которой можно создавать приложения для экспорта в новые СУБД.
  • OneSTools.EventLog.Exporter.ClickHouse — Базовый пакет, реализующий интерфейс IEventLogStorage для экспорта журнала регистрации 1С в ClickHouse
  • OneSTools.EventLog.Exporter.ElasticSearch — Базовый пакет, реализующий интерфейс IEventLogStorage для экспорта журнала регистрации 1С в ElasticSearch
  • EventLogExporter — Служба для экспорта журнала регистрации в ClickHouse и ElasticSearch

Get started:

Конфигурация:

Файл конфигурации (appsettings.json) разбит на несколько секций, каждая из которых отвечают за функциональность определенной части приложения.

Exporter: В этой секции размещены общие параметры экспортера, не зависящие от СУБД.

"Exporter": {
    "StorageType": 2,
    "LogFolder": "C:\\Users\\akpaev.e.ENTERPRISE\\Desktop\\1Cv8Log",
    "Portion": 10000,
    "TimeZone": "Europe/Moscow",
    "WritingMaxDegreeOfParallelism": 8,
    "CollectedFactor": 8,
    "ReadingTimeout": 1,
    "LoadArchive": false
  }

где:

  1. StorageType — тип хранилища жрунала регистрации. Может принимать значения:
    1 — Clickhouse
    2 — ElasticSearch
  2. LogFolder — путь к каталогу журнала регистрации 1С.
  3. Portion — Размер порции, записываемый в БД за одну итерацию (10000 по умолчанию)
  4. TimeZone — часовой пояс (в формате IANA Time Zone Database), в котором записан журнал регистрации. По умолчанию — часовой пояс системы
  5. WritingMaxDegreeOfParallelism — количество потоков записи в СУБД. Т.к. в ClickHouse не поддерживаются одновременные BULK операции, то параметр имеет смысл только для ElasticSearch. По умолчанию — 1.
  6. CollectedFactor — коэффициент количества элементов, которые могут быть помещены в очередь записи. Предельное количество элементов равно Portion * CollectedFactor. По умолчанию — 2.
  7. ReadingTimeout — таймаут сброса данных при достижении конца файла (в секундах). По умолчанию — 1 сек.
  8. LoadArchive — Специальный параметр, предназначенный для первоначальной загрузки архивных данных. При установке параметра в true, отключается "live" режим и не выполняется запрос последнего обработанного файла из БД

ClickHouse: Заполнение секции требуется, если в секции Exporter у параметра StorageType указано значение 1.

"ConnectionStrings": {
    "Default": "Host=localhost;Port=8123;Username=default;password=;Database=database_name;"
  }

ElasticSearch:

"ElasticSearch": {
    "Nodes": [
      {
        "Host": "http://192.168.0.95:9200",
        "AuthenticationType": "0"
      },
      {
        "Host": "http://192.168.0.93:9200",
        "AuthenticationType": "1",
        "UserName": "",
        "Password": ""
      }
      {
        "Host": "http://192.168.0.94:9200",
        "AuthenticationType": "2",
        "Id": "",
        "ApiKey": ""
      }
    ],
    "Index": "upp-main-el",
    "Separation": "M",
    "MaximumRetries": 2,
    "MaxRetryTimeout": 30
  }

где:

  1. Nodes — узел, содержащий хосты кластера ElasticSearch, либо один узел при работе с одной нодой. При недоступности текущего узла будет происходить переключение на следующий узел списка. Для узлов доступны 3 типа аутентификации:
    0 — без аутентификации
    1 — Basic
    2 — ApiKey
  2. Index — префикс названия индекса, конечное название будет определено в зависимости от значения параметра Separation.
  3. Separation — метод разделения данных по индексам. Может принимать значения:
    H (Hour) — делить индексы по часам. Пример конечного названия индекса: index-name-el-2020010113
    D (Day) — делить индексы по дням. Пример конечного названия индекса: index-name-el-20200101
    M (Month) — делить индексы по месяцам. Пример конечного названия индекса: index-name-el-202001
    При указании любого другого (либо не указании вовсе) значения, разделения индекса не будет и конечное название индекса будет выглядеть так: index-name-el-all
  4. MaximumRetries — количество попыток переподключения к очередному узлу
  5. MaxRetryTimeout — таймаут попытки подключения

Так-же при первом подключении к узлу приложение проверяет наличие шаблона индекса (Index template) с именем "oneslogs" и при отсутствии — создает. Если шаблон уже создан, то его перезапись происходить не будет, так как предполагается возможная ручная модификация первично созданного шаблона.

Пример файла кофигурации, содержащий секции для всех поддерживаемых СУБД:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "Exporter": {
    "StorageType": 2,
    "LogFolder": "C:\\Users\\akpaev.e.ENTERPRISE\\Desktop\\1Cv8Log",
    "Portion": 10000,
    "TimeZone": "Europe/Moscow",
    "WritingMaxDegreeOfParallelism": 1,
    "CollectedFactor": 2,
    "ReadingTimeout": 1,
    "LoadArchive": false
  },
  "ClickHouse": {
    "ConnectionString": "Host=192.168.0.93;Port=8123;Database=upp_main_el;Username=default;password=;"
  },
  "ElasticSearch": {
    "Nodes": [
      {
        "Host": "http://192.168.0.95:9200",
        "AuthenticationType": "0"
      }
    ],
    "Index": "upp-main-el",
    "Separation": "M",
    "MaximumRetries": 2,
    "MaxRetryTimeout": 30
  }
}

Использование:

Все приложения могут быть запущены в 2 режимах: как обычное приложение, либо как служба Windows/Linux. Для теста в Вашей среде, достаточно просто выполнить конфигурацию приложения в файле appsettings.json, установить runtime .net 5 (при его отсутствии) и запустить exe/dll. Базы данных в СУБД вручную создавать не нужно, они будут созданы автоматически.

Для запуска приложения как службы необходимо (название службы и путь к исполняемому файлу подставить свои):

Windows:
Поместить файлы приложения в каталог и выполнить в консоли команду:

sc create EventLogExporter binPath= "C:\elexporter\EventLogExporter.exe"

и запустить службу командой:

sc start EventLogExporter

Linux: (на примере Ubuntu 20.04.1 LTS):
В этом примере файлы приложения были помещены в каталог /opt/EventLogExporter
В /etc/systemd/system создать файл eventlogexporter.service с содержимым:

[Service]
Type=notify
WorkingDirectory=/opt/EventLogExporter
ExecStart=/usr/bin/dotnet /opt/EventLogExporter/EventLogExporter.dll

[Install]
WantedBy=multi-user.target

Применить изменения командой:

systemctl daemon-reload

и запустить службу:

systemctl start eventlogexporter.service

Результаты тестирования:

Для теста был использован сервер с Intel Xeon E5-2643 3.40 GHz x2, 128 GB RAM и SAS дисками (Windows Server 2016). Экземпляр ElasticSearch установлен на хосте, экземпляр ClickHouse развернут на нем же в виртуальной машине (Hyper-V) с 4096 MiB RAM. Размер загружаемого журнала регистрации — 945 MiB.

СУБДПорцияВремя загрузки
Потребляемая память
Событий/секMiB/секРазмер таблицы
ClickHouse10000
 1 мин. 41 сек.
~ 60 MiB
      71032
   9.13
56.66 MiB
ElasticSearch50002 мин. 35 сек.~ 100 MiB459686.091106.7 MiB

ClickHouse использовался as is, но на колонки (в зависимости от типа и состава данных) были выставлены кодеки. Для шаблона индекса ElasticSearch были выставлены параметры number_of_shards = 6, number_of_replicas = 0, index.codec = best_compression и использовалось 4 потока записи.

Исходные коды этих приложений и других библиотек для работы с данными 1С можно посмотреть на моей странице Github. Там же можно бесплатно скачать архивы.

has been added to your cart:
Оформление заказа