Приветствую всех любителей экспертизы, а также всех заинтересованных в теме ХайЛоуда.
В одной из прошлых своих статей я писал на шарпе софтину для преобразования тех. журнала 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С )
Вступайте в нашу телеграмм-группу Инфостарт