Удалил релизы инструментов, которые были выложены здесь. Все последующие обновления и справочная информация обновляются и доступны только на странице репозитория. Оставлю эту статью как анонс.
Реализована работа только с файловым форматом журнала (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
}
где:
- StorageType - тип хранилища жрунала регистрации. Может принимать значения:
1 - Clickhouse
2 - ElasticSearch - LogFolder - путь к каталогу журнала регистрации 1С.
- Portion - Размер порции, записываемый в БД за одну итерацию (10000 по умолчанию)
- TimeZone - часовой пояс (в формате IANA Time Zone Database), в котором записан журнал регистрации. По умолчанию - часовой пояс системы
- WritingMaxDegreeOfParallelism - количество потоков записи в СУБД. Т.к. в ClickHouse не поддерживаются одновременные BULK операции, то параметр имеет смысл только для ElasticSearch. По умолчанию - 1.
- CollectedFactor - коэффициент количества элементов, которые могут быть помещены в очередь записи. Предельное количество элементов равно Portion * CollectedFactor. По умолчанию - 2.
- ReadingTimeout - таймаут сброса данных при достижении конца файла (в секундах). По умолчанию - 1 сек.
- 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
}
где:
- Nodes - узел, содержащий хосты кластера ElasticSearch, либо один узел при работе с одной нодой. При недоступности текущего узла будет происходить переключение на следующий узел списка. Для узлов доступны 3 типа аутентификации:
0 - без аутентификации
1 - Basic
2 - ApiKey - Index - префикс названия индекса, конечное название будет определено в зависимости от значения параметра Separation.
- Separation - метод разделения данных по индексам. Может принимать значения:
H (Hour) - делить индексы по часам. Пример конечного названия индекса: index-name-el-2020010113
D (Day) - делить индексы по дням. Пример конечного названия индекса: index-name-el-20200101
M (Month) - делить индексы по месяцам. Пример конечного названия индекса: index-name-el-202001
При указании любого другого (либо не указании вовсе) значения, разделения индекса не будет и конечное название индекса будет выглядеть так: index-name-el-all - MaximumRetries - количество попыток переподключения к очередному узлу
- 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/сек | Размер таблицы | |||
---|---|---|---|---|---|---|---|---|---|
ClickHouse | 10000 |
|
~ 60 MiB |
|
|
56.66 MiB | |||
ElasticSearch | 5000 | 2 мин. 35 сек. | ~ 100 MiB | 45968 | 6.09 | 1106.7 MiB |
ClickHouse использовался as is, но на колонки (в зависимости от типа и состава данных) были выставлены кодеки. Для шаблона индекса ElasticSearch были выставлены параметры number_of_shards = 6, number_of_replicas = 0, index.codec = best_compression и использовалось 4 потока записи.
Исходные коды этих приложений и других библиотек для работы с данными 1С можно посмотреть на моей странице Github. Там же можно бесплатно скачать архивы.