Выгрузка журнала регистрации 1С в ClickHouse с помощью Vector

10.11.22

База данных - Журнал регистрации

Данное решение предназначено для выгрузки журнала регистрации из 1С 8.2 - 8.3 (формат журнала LGF/LGP) в ClickHouse. Одной из отличительных особенностей данного решения является возможность подключения экспортера ЖР к системам мониторинга.

Скачать исходный код

Наименование Файл Версия Размер
Выгрузка журнала регистрации 1С в ClickHouse с помощью Vector:
.zip 5,91Kb
55
.zip 1.0.2 5,91Kb 55 Скачать

Приветствую, коллеги.

Этим решением хочу предложить сообществу еще один способ выгрузки журнала 1С в ClickHouse.

Предыстория

Как и у многих, у нас в компании возникали неудобства и сложности при использовании стандартного журнала регистрации 1С. В поиске решения этой проблемы мы обратили внимание на разработку Евгения Аклаева, наверное, это лучшее решение из того, что можно найти в открытом доступе. 

Но при тестировании этого решения мы обнаружили, что иногда экспортер перестает отправлять данные в ClickHouse (помогал только перезапуск), происходит, вероятно, это при потере связи с ClickHouse. Гарантировать бесперебойный доступ к ClickHouse мы не могли, поскольку базы 1С у нас территориально размещены на разных площадках (филиалах), и периодически могут возникать кратковременные перебои со связью по независящим от нас причинам. Из-за этой проблемы и невозможности подключить экспортер к мониторингу нам пришлось продолжить поиск инструмента для выгрузки ЖР 1С.

Так как у нас ранее уже был положительный опыт использования на не 1С проектах сборщика логов Vector, то мы решили попробовать его применить и для 1С.

Немного о Vector

Vector это кроссплатформенный open-source сборщик логов с возможностями ETL.

Его задача заключается в том, чтобы взять из некоторого источника лог, при необходимости как то его трансформировать и отправить в некоторое хранилище. Написан Vector на Rust, что позволяет показывать ему очень хорошие результаты по производительности при скромном потреблении ресурсов.

В Vector можно писать очень гибкие алгоритмы трансформации данных на встроенном языке VRL или на языке LUA в случае, если возможностей VRL не хватает. И, что немаловажно, Vector имеет встроенный экспортер своих метрик в Prometheus, что позволяет настроить его мониторинг например в Grafana, а также у Vector есть возможность проверять статус его работы (healthcheck) путем обычного GET запроса. На момент написания статьи проект Vector имеет около 18K звезд на github.

В общем, инструмент хороший, и нам оставалось только подружить его с логом 1С, что мы собственно и сделали. Алгоритм парсера журнала 1С был написан на основе статьи Антона Ширяева, огромная ему благодарность за проделанную работу, а формат таблицы в ClickHouse мы оставили почти такой же, как в экспортере Евгения Аклаева, что по идее должно дать возможность продолжить пользоваться уже существующими инструментами для просмотра журнала: вариант1, вариант2.

Если в вашей инфраструктуре не развернуты ClickHouse, Grafana и Prometheus, то для тестирования работы предлагаемого решения вы можете развернуть их самостоятельно с помощью Docker, Docker-compose конфиг с этими сервисами есть в архиве, а о том, как настроить ClickHouse в Docker, я писал в этой статье.

Инструкция по установке и настройке Vector для windows

  • Скачиваем и устанавливаем дистрибутив Vector c официального сайта.
    (я использую вариант дистрибутива: Windows MSI)
  • Распаковываем архив, приложенный к статье, например в c:\collector\
  • Редактируем файл collector.cmd, в нем через переменные окружения задаются настройки сборщика:
    onec_logs_path - путь к папке, где хранятся логи 1С

onec_logs_server - адрес сервера ClickHouse

onec_logs_database - база данных CH

onec_logs_user - пользователь CH

onec_logs_password - пароль CH

onec_logs_table_logs - таблица для ЖР 1С

onec_logs_table_errors - таблица для сообщений об ошибках парсинга ЖР

onec_logs_api_ip_port - ip, порт для проверки состояния сборщика

onec_logs_metric_ip_port - ip, порт для экспорта метрик в prometheus 

onec_logs_debug - режим отладки

  • Создаем в ClickHouse базу данных с именем, что и в переменной onec_logs_database и далее в этой базе создаем две таблицы: одну для журнала 1С с именем, заданным в переменной onec_logs_table_logs
    и вторую для хранения ошибок парсинга журнала с именем заданной в переменной onec_logs_table_errors. Скрипты для создания этих таблиц приведены в файлах create-table-ones-logs.sql, create-table-ones-logs-error.sql.
  • Для запуска сборщика запускаем файл collector.cmd.

После запуска сборщика в папке с журналом 1С будет создана папка input_logs, в ней хранятся данные о том, на какой позиции обработки находится сборщик, важно знать, что если эту папку удалить, то сборщик логов начнет отправку данных журнала с самого начала.

Данное решение предполагает отправку журнала регистрации только из одной базы 1С, поэтому если вам нужно отправлять ЖР из нескольких баз, просто размножьте файл collector.cmd с внесением необходимых изменений для каждой базы 1С.

Настройка мониторинга

Для того, чтобы проверить, что сборщик находится в рабочем состоянии, нужно отправить GET запрос на http://host:port/health.

Номер порта задается в переменной onec_logs_api_ip_port. В случае, если Vector находится в рабочем состоянии, в ответ мы получим сообщение в json формате: {"ok":true} с кодом статуса 200.

 

 

Для того, чтобы информацию о статусе сборщика можно было мониторить с помощью Grafana, можно воспользоваться blackbox exporter. Blackbox exporter - это сервис, предназначенный для того, чтобы собирать информацию о доступности сервисов и отдавать ее в виде Prometheus метрик.

Метрики сборщика можно получить, перейдя по адресу http://host:port/metrics/.

Номер порта задается в переменной onec_logs_metric_ip_port.

 

 

Пример дашборда с метриками Vector можно скачать из маркета Grafana, выглядит она следующим образом:

 

 

А описание всех существующих метрик можно получить, обратившись к официальной документации Vector.

Как это работает

Конфигурация Vector находится в файле vector.toml и разбита на секции, которые из себя представляют блоки конвейера (pipeline) по обработкие потока данных (журнала 1С). Визуально этот конвейер выглядит следующим образом:

 

 

В секции [sources.input_logs] указывается, откуда брать файлы ЖР 1С, а в параметре multiline.condition_pattern указывается регулярное выражение, по которому Vector разделяет строки в лог файле на отдельные записи журнала. Подробнее о возможных настройках можно почитать в документации.

Секция [transforms.remap_logs] ссылается на файл transform.vrl, в котором размещен алгоритмом трансформации, задачей которого является: 

  1. разбить полученную строку лога на отдельные колонки. Разбиение записи журнала на колонки также выполняется с помощью регулярного выражения.
  2. Преобразовать дату записи журнала в формат, который понимает ClickHouse.
  3. В случае, если в процессе парсинга лога произойдет ошибка, записать ее в поле err.

Полученные в результате трансформации данные поступают на вход фильтров. В случае, если поле err не пустое (возникла ошибка), то информация об ошибке отправляется в таблицу с ошибками, имя которой задается в переменной onec_logs_table_errors.

Если ошибок не было (поле err пусто), то данные поступают в секцию [transforms.preparation_data], в которой происходит обогащение данных лога из словаря 1Cv8.lgf. Алгоритм работы со словарем находится в файле transform.lua. После обогащения данные отправляются в ClickHouse в таблицу с именем описанной в переменной onec_logs_table_logs.

В заключение хотелось бы сказать, что Vector с легкостью запускается в ОС Linux или Docker контейнере.

Надеюсь получить от сообщества конструктивную обратную связь и помощь в развитии данного решения.

ЖР ClickHouse Vector Prometheus

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22570    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9288    9    8    

11

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48797    96    163    

86

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30064    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19269    52    50    

29

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

21600 руб.

15.05.2017    42613    10    24    

38
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. user612295_death4321 14.11.22 13:24 Сейчас в теме
Как часто отваливается сервис ? Если сравнивать с разработкой Евгения.
Ростислав; +1 Ответить
3. axilab 89 15.11.22 03:36 Сейчас в теме
(1) Пока объективной статистикой поделится не могу потому что данное решения опубликовал после двух недель использования в продакшен (12 серверов, 24 базы). За это время никаких проблем с сборщиком не возникало.
2. ImHunter 315 14.11.22 14:52 Сейчас в теме
Из статьи не уловил, как сделать периодическую выгрузку журнала. Зашедулить выполнение collector.cmd?
4. axilab 89 15.11.22 03:45 Сейчас в теме
(2) Нет, так лучше не делать. Сборщик запускается разово и следит за изменениями в файлах журнала, и по мере появления новых данных в журнал они отправляются в ClickHouse. Т.е. данные в ClickHouse поступают практически в режиме реального времени (с задержкой примерно 5 секунд).
5. user660878_to101kv 15.11.22 09:08 Сейчас в теме
Так же столкнулся с тем, что иногда экспортер Евгения отваливался с ошибкой Failed to write data to v8logs, на гитхабе была дискусия на эту тему, кто то писал что не хватает оперативной памяти, но если глянуть на граффики в заббиксе, то с ней все норм.

За день был написан сервис, некий clickhouse watcher, который следил за появлением новых данных в бд клика, при отсутствии онных в течении заданного количества минут, сервис пинал сервис EventLogExporter-a ) Справедливости ради, отмечу что это не единственная задача сервиса, среди его функций есть архивация старых ЖР и отправка на репу в долговременное хранение, дополнительная чистка бесполезных данных по условиям и удаление данных выходящих за заданную глубину хранения.

Работает с февраля безотказно, бывает по некоторым системам сервис шлет алерт что данные не появляются какое то количество времени и перезапуски не помогают, как правило ночью, в момент переключения с одного файла жр на другой, либо в моменты обновления, после появления данных сервис ОКает и шлет этот ок в телегу.
6. axilab 89 15.11.22 12:07 Сейчас в теме
(5) Круто.. Как было сказано в одном культовом фильме..:)
Жить захочешь – не так раскорячишься!
Прикрепленные файлы:
8. Dach 373 16.11.22 11:03 Сейчас в теме
(5) а можете поделиться кодом сервиса? Есть репо на github?
11. user660878_to101kv 16.11.22 16:41 Сейчас в теме
(8) + изменил этот кусок на упорядочивание по дате времени, т.к. при перезапуске службы экспортера, иногда экспортер ругался на отсутствие файла предыдущего дня и каждый запуск начинал чтение с начала файла)
Прикрепленные файлы:
7. ImHunter 315 16.11.22 06:30 Сейчас в теме
Можно ли сделать классификацию событий? Например, есть некоторые ошибки, по которым нужно вывести общую статистику их возникновения.
9. axilab 89 16.11.22 14:52 Сейчас в теме
(7) Если я правильно понял вопрос то да.
Понимая условия отбора и группировки нужно написать соответствующий SQL запрос к таблице журнала в ClickHouse.
12. Cyberhawk 135 24.11.22 10:29 Сейчас в теме
Аклаева
Ошибка в фамилии.
13. eawolf83 29.11.22 07:47 Сейчас в теме
Добрый день.
Скачал вашу выгрузку. Поднял CH в докере, настроил vector, запустил.
Вроде запустилось, но в таблицы CH ничего не записалось.
В каталоге с логами появился файл checkpoints.json :

{"version":"1","checkpoints":[{"fingerprint":{"dev_inode":[1215617734,1338976464212682653]},"position":8298,"modified":"2022-11-29T04:38:37.660894900Z"}]}


Куда начать смотреть, чтобы разобраться?
14. axilab 89 29.11.22 08:35 Сейчас в теме
(13)
Приветствую, обычно если есть какие то проблемы то Vector выводит сообщения об ошибках в консоль.
Скиньте сюда скрин консоли Vector, иначе гадать о причинах можно бесконечно долго.
16. batsy66 61 20.02.23 17:20 Сейчас в теме
(13)Аналогичная проблема. Так и не получается запустить трансформацию логов

2023-02-20 16:47:13 2023-02-20T13:47:13.320886Z INFO vector::app: Internal log rate limit configured. internal_log_rate_secs=10
2023-02-20 16:47:13 2023-02-20T13:47:13.321176Z INFO vector::app: Log level is enabled. level="vector=info,codec=info,vrl=info,file_source=info,tower_limit=trace,rdkafka=info,buffers=info,lapin=info,kube=info"
2023-02-20 16:47:13 2023-02-20T13:47:13.329720Z INFO vector::app: Loading configs. paths=["/etc/vector/vector.toml"]
2023-02-20 16:47:13 2023-02-20T13:47:13.550993Z INFO vector::topology::running: Running healthchecks.
2023-02-20 16:47:13 2023-02-20T13:47:13.551625Z INFO vector::topology::builder: Healthcheck passed.
2023-02-20 16:47:13 2023-02-20T13:47:13.551844Z WARN http: vector::internal_events::http_client: HTTP error. error=error trying to connect: tcp connect error: Connection refused (os error 111) error_type="request_failed" stage="processing" internal_log_rate_limit=true
2023-02-20 16:47:13 2023-02-20T13:47:13.551914Z ERROR vector::topology::builder: msg="Healthcheck failed." error=Failed to make HTTP(S) request: error trying to connect: tcp connect error: Connection refused (os error 111) component_kind="sink" component_type="clickhouse" component_id=emit_log_sucsess component_name=emit_log_sucsess
2023-02-20 16:47:13 2023-02-20T13:47:13.552251Z INFO source{component_kind="source" component_id=input_logs component_type=file component_name=input_logs}: vector::sources::file: Starting file server. include=["/etc/tmp/logs\\\\*.lgp"] exclude=[]
2023-02-20 16:47:13 2023-02-20T13:47:13.553489Z INFO vector: Vector has started. debug="false" version="0.27.0" arch="x86_64" revision="5623d1e 2023-01-18"
2023-02-20 16:47:13 2023-02-20T13:47:13.553546Z INFO vector::sinks::prometheus::exporter: Building HTTP server. address=127.0.0.1:9598
2023-02-20 16:47:13 2023-02-20T13:47:13.560225Z INFO source{component_kind="source" component_id=input_logs component_type=file component_name=input_logs}:file_server: file_source::checkpointer: Loaded checkpoint data.
2023-02-20 16:47:13 2023-02-20T13:47:13.587920Z INFO vector::internal_events::api: API server running. address=127.0.0.1:8686 playground=http://127.0.0.1:8686/playground


Vector и CH запустил в контейнерах
15. eawolf83 29.11.22 12:06 Сейчас в теме
(14)
Вроде заработало, записи в CH появились с какого-то раза, сам не понял что сделал.
17. user1877236 12.04.23 10:55 Сейчас в теме
а как делать выгрузку для двух баз на одном сервере приложений? настроил два файла collector.cmd на две базы запускаю их, один работает а второй выдает ошибку:

2023-04-12T07:27:13.692975Z ERROR source{component_kind="source" component_id=input_logs component_type=file component_name=input_logs}: vector_common::finalizer: FinalizerSet task ended prematurely. error=channel closed
18. medstoun 20.06.23 15:41 Сейчас в теме
У меня вот такой вопрос, папка с логами 1С находится на виртуальной машине на убунту, а кликхаус на другой виртуальной машине, которая тоже на убунту. Вопрос: как мне сделать так что бы логи из одной виртуальной машины экспортировались на другую виртуальную машину(на ту на которой находится кликхаус)?
Оставьте свое сообщение