Перенос логов технологического журнала в ClickHouse

02.04.26

База данных - HighLoad оптимизация

tjclick - кроссплатформенная утилита для копирования логов технологического журнала платформы 1С в КликХаус

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Перенос логов технологического журнала в ClickHouse:
.7z 11,55Mb ver:1.0
0 6 200 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Приветствую всех любителей экспертизы, а также всех заинтересованных в теме ХайЛоуда.

В одной из прошлых своих статей я писал на шарпе софтину для преобразования тех. журнала 1С из старого формата в новый. На основе того же движка парсинга я сделал загрузку журнала в ClickHouse.

Представляю вашему вниманию кроссплатформенную утилиту tjclick.

 

 

Зачем это надо? Кто хоть раз видел логи технологического журнала 1С, тот понимает, как тяжко их анализировать. Потому что их может быть ОЧЕНЬ много, каждое событие может содержать различное кол-во полей/данных, событие может быть разбито на несколько строк, строковые поля могут быть обрамлены одинарными или двойными кавычками, а могут и не быть ими обрамлены. Поэтому упорядочивание событий журнала требует некоторой подготовки (скилла), а также длительно по времени (логи могут занимать десятки гигабайт).

Утилита работает очень просто: указываете ей папку с логами и строку подключения к Клику. Ждёте несколько минут - и ваши логи структурированно упакованы в колоночную СУБД. Не буду вдаваться в тонкости различий между реляционными и колоночными СУБД, скажу лишь важное: в Клике журнал занимает на порядок меньше места, а поиск нужных событий или сгруппированных событий происходит практически моментально.

Заюзать всё это не составит большого труда. Если вы Кликом пользуетесь постоянно, то можно смело переходить к копированию тех. журнала, ну а если вам надо для разового/периодического анализа и вы не имеете работающего Клика, то следуйте дальнейшим указаниям. Для начала установите движок Докера (если он у вас ещё не установлен в 2К26-м году). А потом введите волшебную команду:

docker run -d -p 8123:8123 -p 9000:9000 -e TZ=Europe/Moscow -e CLICKHOUSE_PASSWORD=censored --name tjclick --ulimit nofile=262144:262144 clickhouse/clickhouse-server

здесь можете поменять маппинг портов (первые числа до двоеточия в опциях -p), обязательно часовой пояс (под временную зону сбора логов) и имя контейнера, если tjclick вас бесит )

Движок Докера сам скачает, развернёт и запустит СУБД ClickHouse. Если сделали всё по красоте, можно перейти на веб-морду и проверить, поднялся ли инстанс базы. Должны пронаблюдать такую картину:

 

 

откуда можно провалиться в написатор/выполнятор ваших запросов и прочее.

Копирование собранных логов технологического журнала 1с в СУБД КликХаус с помощью утилиты осуществляется в 1 команду:

tjclick.exe -d "C:\TEMP\1c_logs" -c "Host=127.0.0.1;Port=8123;Protocol=http;Database=default;Username=default;Password=censored;"

Обратите внимание, что протокол может быть ТОЛЬКО http или https (tcp не поддерживается утилитой, т.к. dotnet-овский драйвер работает только по гипертексту).

По окончании обработки файлов логов утилита выдаст сводную информацию, типа такой:

================================
Empty files: 96
Data files: 39
Data size: 1,2 GiB
Total events: 668'508
Total time: 00:00:33

 

Тонкости реализации: написано на C# под .NET 8.0, но прикладываю скомпилированные бинари в нативный код (PE под windows и ELF под linux). Для вин копмилил в последней 11ке, для лин - в докеризированной убунте 22.04. Программы (файлы-всё-в-одном) получились размером 17..20 Мб, т.к. содержат все зависимые либы (и частично что-то от рантайма платформы .NET). Если базы с именем "tj1c" в СУБД нет, то она автоматически создастся. Если в базе нет таблицы "tj", то она также автоматически создастся. В процессе загрузки журнала в СУБД в консоли будет отображаться информация: время запуска и завершения, текущий обрабатываемый файл, кол-во событий, отправляемых в Клик. Максимальный размер пакета: 20 тыс. событий. Есть жёсткое ограничение по памяти на размер пакета. Все события валятся в единственную таблицу, в которой может быть несколько десятков колонок. При повторном запуске утилиты tjclick данные будут добавлены в ту же самую таблицу. Заметил, что в linux работает в ~3 раза медленнее, чем в windows, причём и в среде CLR, и в нативном исполнении (видимо, какая-то специфика в dotnet под *nix, возможно, из-за рефлексии, но это не точно). На винде скорость обработки ТЖ на моём железе достигает 2...4 Гига в минуту или 6...18 Килособытий в секунду.

...
C:\TEMP\1c_logs\locks_man\rmngr_380359\26033013.log
empty
C:\TEMP\1c_logs\locks_man\rmngr_380359\26033014.log
saved 396 events
C:\TEMP\1c_logs\locks_man\rphost_386211\26033006.log
empty
C:\TEMP\1c_logs\locks_man\rphost_386211\26033007.log
saved 1'943 events
C:\TEMP\1c_logs\locks_man\rphost_386211\26033008.log
saved 20'000 events
saved 20'000 events
C:\TEMP\1c_logs\locks_man\rphost_386211\26033009.log
saved 20'000 events
saved 2'835 events
C:\TEMP\1c_logs\locks_man\rphost_386211\26033010.log
C:\TEMP\1c_logs\locks_man\rphost_386211\26033011.log
saved 20'000 events
...

 

Как анализировать события в Клике? Ставим (если ещё не установлен) DBeaver Community Edition.

Подключаемся к нашему инстансу:

 

 

И можем делать привычные нам запросы а-ля SQL. Смотрите, как просто получить топ слоупочных запросов:

select ts, round(duration / 1_000_000) as sec, sql, context, usr
from `tj1c`.`tj`
where name = 'DBPOSTGRS'
order by 2 desc
limit 20;

 

 

Самый кайф в том, что результат запроса мы получили за какие-то доли секунды (!)

А теперь возьмём и бахнем топчик самых часто выполняемых запросов (с группировкой по тексту запроса), т.е. получим мелкие запросы, которые выполняются многократно, но по сумме затраченного времени печалят базу:

select replaceRegexpAll(sql, '#tt[0-9]*', '#tt'), count(1), sum(duration)
from `tj1c`.`tj`
where sql is not null
group by 1
having count(1) > 20
order by 3 desc
limit 50;

И на это тоже затрачены доли секунды (!). Реляционным СУБД такое не снилось даже...

Сравните это с мазохизмом парсингом в консоли:

 

* текст получен на одной из открытых конференций по 1с

Мало того, что оно может выполняться около вечности, так ещё и ошибка в такой портянке магических текстов заставит вас отлаживать эту дичЪ долгие вечера со слезами на глазах. И это с учётом того, что вы сечёте в Линуксах, всяких потоковых редакторах, регулярках и т.п.

Также в Клике удобно искать взаимоблокировки - одним SQL запросом можно получить пару эсных запросов с их контекстами, которые ждут друг друга. И т.д. и т.п. Можно придумать множество других сценариев. Анализ тех. журнала превратится в удовольствие, а не будет мучением. tjclick значительно ускорит вам поиск узких мест в эске. Думаю, что теперь ваша жизнь изменится к лучшему )


sha256 tjclick_1.0.7z : cccd8dd41ddd4814fc944de7cfae787187d44a8d7153802e9236850083e234bc

Совместимо с обычными plaintext (НЕ JSON) версиями любых технологических журналов 1С от платформ 8.3 и 8.5.

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

И не забывайте про мой ГитХаб. Дальше будет только интереснее.

Всем быстрой 1С )

 

Вступайте в нашу телеграмм-группу Инфостарт

tjclick тж технологический журнал ClickHouse эксперт парсинг high load высокая нагрузка C#

См. также

HighLoad оптимизация Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    7564    ivanov660    48    

52

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    9647    ivanov660    39    

61

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    12135    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    18623    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    9116    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    12603    vasilev2015    22    

47
Для отправки сообщения требуется регистрация/авторизация