Сервис для парсинга журналов регистрации и технологического журнала 1С:Предприятие с загрузкой в ClickHouse. Предоставляет визуализацию в Grafana и MCP-интерфейс для AI-агентов.
📘 Для AI-агентов: См. README_AI.md — детальная техническая информация для разработки и использования проекта.
- Обзор
- Возможности
- Архитектура
- Требования
- Быстрый старт
- Конфигурация
- Таблицы ClickHouse
- Дашборды Grafana
- Troubleshooting
- Документация
- TODO
- Благодарности
Этот проект обеспечивает:
- Парсинг логов 1С (журнал регистрации .lgf/.lgp и технологический журнал)
- Хранение в ClickHouse с партиционированием и TTL
- Визуализацию в Grafana (дашборды активности, ошибок, новых проблем)
- MCP-интерфейс для AI-агентов (компактный/полный JSON)
- ✅ Чтение форматов
.lgf,.lgp,.lgx - ✅ Поддержка серверных и файловых баз
- ✅ Контроль дубликатов (опционально)
- ✅ Доп.колонка с Нормализованным текстом комментария
- ✅ Идентификация по GUID кластера и базы
- ✅ Журнал регистрации на 30Гб и 250млн строк ~50 минут (без дедупликации)
- ✅ Параллельное чтение всех файлов (всех баз)
- ✅ Парсинг текстового формата (иерархический/plain)
- ✅ Парсинг JSON формата
- ✅ Сохранение всех свойств событий
- ✅ Обработка ротации и сжатия (zip)
- на больших объемах пока не гонял, на тестах ~170 записей в секунду (при параллельном чтении файлов)
- ✅ Параллельное чтение всех файлов
- ✅ Таблицы:
event_log,tech_log- для хранения результатов парсингаfile_reading_progress- информация о прогрессе чтения файлов логовparser_metrics_extended- контроль/анализ производительности
- ✅ Партиционирование по дням
- ✅ Настраиваемый TTL (по умолчанию 30 дней)
- ✅ Dashboard: 1C Event Log - Overview (Общая активность)
- ✅ Dashboard: 1C Event Log - Errors (новые ошибки за 24 часа, нормализация ошибок)
- ✅ Dashboard: 1C Event Log - Explorer (полный Журнал регистрации с фильтрами)
- ✅ Dashboard: 1C Event Log - Metadata Analysis (аналитика по методанным)
- ✅ Dashboard: 1C Event Log - Temporal Patterns (графики активности) Для удаления предустановленных дашбордов удалите файлы в каталоге /deploy/grafana/provisioning/dashborads/
Чтение логов:
- ✅
logc_get_event_log: получение логов журнала регистрации - ✅
logc_get_tech_log: получение технологического журнала - ✅
logc_get_actual_log_timestamp: получение максимальной отметки времени в логах для базы
Настройка техжурнала:
- ✅
logc_save_techlog: сохранение текущей конфигурации как backup (.OLD) - ✅
logc_configure_techlog: генерация logcfg.xml - ✅
logc_restore_techlog: восстановление конфигурации из backup (.OLD) - ✅
logc_disable_techlog: отключение техжурнала - ✅
logc_get_techlog_config: чтение текущей конфигурации
Режимы вывода:
- ✅
minimal(компактный, экономия токенов) - ✅
full(все поля для детального анализа)
Windows Host (1C Logs)
↓ (volume mount, read-only)
Docker Compose Stack
├── log-parser (Go)
│ ├── Event Log Reader
│ ├── Tech Log Tailer
│ ├── Batch Writer
│ └── Offset Storage (BoltDB)
│
├── ClickHouse
│ ├── event_log table
│ └── tech_log table
│
├── MCP Server (Go)
│ ├── get_event_log tool
│ └── get_tech_log tool
│
└── Grafana
└── Auto-provisioned Dashboards
AI Agent (Claude, etc.) ← MCP protocol
- Язык: Go 1.21+
- База данных: ClickHouse 23.8+
- Визуализация: Grafana 11.0+
- Контейнеризация: Docker + Docker Compose
- Offset Storage: BoltDB
- Observability: OpenTelemetry (трейсинг), zerolog (логирование)
- Docker Desktop 20+
- Docker Compose 3.8+
- Windows (для доступа к логам 1С)
- 1С:Предприятие 8.3+ (источник логов)
git clone <repository-url>
cd 1c-log-checkerОткройте /deploy/docker/
Скопируйте пример конфигурации: .env.example --> .env
Отредактируйте deploy/docker/.env и укажите пути:
LOG_DIRS=C:\Program Files\1cv8\srvinfo
TECHLOG_CONFIG_DIR=D:\My Projects\FrameWork 1C\1c-log-checker\configs\techlog\
TECHLOG_DIRS=D:\My Projects\FrameWork 1C\1c-log-checker\tech_logsПереопределите место хранения конфигурации технологического журнала (сервис не может работать с системной директорией). По-умолчанию я предлагаю его поместить в каталоге проекта. Файл будет создан в /configs/techlog/logcfg.xml.
Согласно ИТС (https://its.1c.ru/db/v8311doc#bookmark:adm:TI000000376) в файл conf.cfg нужно добавить строку, указывающую где платформе искать файлы конфига, если их нет в "стандартном каталоге". conf.cfg хранится в нескольких местах - первично читается из каталога с платформой конкретной версии. В нем указана переадресация в каталог C:\Program Files\1cv8\conf, что бы для всех версий использовались одни настройки. Переопределить каталог еще раз из директории C:\Program Files\1cv8\conf\ НЕ удаётся (на 8.3.27 не сработало), поэтому переопределяем в каталоге каждой платформе, которую используем (Пример: C:\Program Files\1cv8\8.3.27.1719\bin\conf)
# Указываем тот же путь, что указали в файле deploy/docker/.env в параметре TECHLOG_CONFIG_DIR
ConfLocation=D:\ProjectCatalog\configs\techlog\Установить проект https://github.com/SteelMorgan/cursor-anthropic-skills/ или хотя бы отдельно навык /tree/main/custom-skills/TECHLOG_SKILL.md. Проект обеспечивает подхватывание навыка агентом самостоятельно, если ставите навык отдельно - то для Cursor подключайте как Project Rule, для Claude Cod как обычный навык. Что в навыке:
- объясняет агенту workflow для ТЖ
- ключевые знания по работе с ТЖ
# HTTP
{
"mcpServers": {
"1c-log-checker": {
"url": "http://localhost:8080",
"transport": "http"
}
}
}# STDIO
{
"mcpServers": {
"1c-log-checker": {
"command": "docker",
"args": [
"exec", "-i", "1c-log-mcp",
"/app/mcp"
],
"env": {
"MCP_MODE": "stdio",
"CLICKHOUSE_HOST": "clickhouse",
"CLICKHOUSE_PORT": "9000",
"CLICKHOUSE_DB": "logs"
}
}
}
}configs в корне проекта (если её нет) и разместить там файл cluster_map.yaml. Образец файла находится в configs/cluster_map.yaml.example. Подсказка агенту куда смотреть в описании инструментов.
Это необходимо, чтобы агент знал GUID базы/кластера, с которыми работает в проекте, и мог обращаться за логами конкретной базы.
Шаги:
- Создайте папку
configsв корне проекта (если её нет) - Скопируйте образец:
configs/cluster_map.yaml.example→configs/cluster_map.yaml - Отредактируйте
configs/cluster_map.yamlи укажите реальные GUID ваших кластеров и баз
clusters:
"your-cluster-guid":
name: "Production Cluster"
infobases:
"your-infobase-guid":
name: "ERP Production"
cluster_guid: "your-cluster-guid"Как получить GUIDы — см. docs/guides/get-guids.md или любой другой удобный для вас способ (в гугле много вариантов)
cd deploy/docker
docker-compose up -d- ClickHouse: http://localhost:8123/play
- Grafana: http://localhost:3000 (без авторизации, если хотите - можно настроить, попросите агента)
- MCP Server: http://localhost:8080
| Переменная | Описание | По умолчанию |
|---|---|---|
LOG_DIRS |
Пути к каталогам журнала регистрации (через ;) |
- |
TECHLOG_DIRS |
Пути к каталогам технологического журнала (через ;) |
- |
CLICKHOUSE_HOST |
Хост ClickHouse | localhost |
CLICKHOUSE_PORT |
Порт ClickHouse | 9000 |
CLICKHOUSE_DB |
База данных ClickHouse | logs |
LOG_RETENTION_DAYS |
Срок хранения логов (дни) | 30 |
READ_ONLY |
Технический режим (только чтение, без записи в CH) | false |
MCP_PORT |
Порт MCP-сервера | 8080 |
MAX_WORKERS |
Количество параллельных поток парсинга | 4 |
BATCH_SIZE |
Размер батча для записи в ClickHouse | 5000 |
BATCH_FLUSH_TIMEOUT |
Таймаут флуша батча в миллисекундах | 1000 |
ENABLE_DEDUPLICATION |
Включить проверку дубликатов записей | false |
LOG_LEVEL |
Уровень логирования: debug = дебаг-файл (/logs/parser_all_records.jsonl), info/warn/error = логи сервиса в файл (/logs/parser.log, /logs/mcp.log) |
error |
В принципе ключевые переменные указаны в разделе "Быстрый старт".
deploy/docker/.env— переменные окружения (скопируйте изdeploy/docker/.env.example)configs/cluster_map.yaml— маппинг GUID → имена кластеров/баз (размещается в папкеconfigsв корне проекта, образец вconfigs/cluster_map.yaml.example)deploy/docker/docker-compose.yml— конфигурация Docker Compose
Хранит события журнала регистрации 1С (.lgf/.lgp форматы).
Основные поля:
event_time— дата и время событияlevel— уровень события (Error, Warning, Information, Note)infobase_name- имя базыevent_presentation— Событие (например, "Данные. Изменение")user_name— имя пользователяmetadata_presentation— представление объекта метаданных (Документ.УстановкаЦенНоменклатуры)data_presentation— представление данных (Установка цен номенклатуры -0000002228 от 01.11.2025)comment— комментарий к событию (это же текст ошибки)comment_normalized— нормализованный комментарий ошибки (для агрегации по видам ошибок). Заполняется асинхронно после записи записи в таблицу для записей сlevel = 'Error'. Динамические части (GUID, timestamp, числа, строки) заменяются на плейсхолдеры (<GUID>,<TIMESTAMP>,<NUMBER>,<STRING>)
Структура:
- Партиционирование по дням (
event_date) - TTL: настраиваемый через
LOG_RETENTION_DAYS(по умолчанию 30 дней) - Первичный ключ (ORDER BY):
cluster_guid,infobase_guid,event_time,session_id,record_hash - Вторичные индексы: на все основные поля (level, event, user_name, metadata и др.)
Хранит события технологического журнала 1С (text и json форматы).
Основные поля:
ts— временная метка событияname— тип события (EXCP, DBMSSQL, TLOCK, CONN и др.)level— уровень (ERROR, WARN, INFO)duration— длительность операции в микросекундахsession_id,transaction_id— идентификаторы сеанса и транзакции
Динамические свойства (зависят от типа события):
sql,plan_sql_text— для SQL-запросов (DBMSSQL, DBPOSTGRS)exception,exception_descr— для исключений (EXCP)query,sdbl— для запросов к модели данных (SDBL)- И другие свойства в зависимости от типа события (каждое свойство сохранено в отдельную колонку)
Структура:
- Партиционирование по дням
- TTL: настраиваемый через
LOG_RETENTION_DAYS(по умолчанию 30 дней) - Первичный ключ (ORDER BY):
cluster_guid,infobase_guid,name,ts,record_hash - Вторичные индексы: на все основные поля (level, duration, session_id, sql, exception и др.)
Общая активность системы
- Графики активности по времени (частота событий)
- Распределение по уровням (Error, Warning, Information, Note)
- Список последних событий с фильтрами
- Статистика по базам и кластерам
Новые ошибки за последние 24 часа
- Ошибки, появившиеся впервые за период
- Автообновление каждую минуту
- Статистика по базам и кластерам
- Группировка по типам ошибок
- Примеры записей для каждой ошибки
Наиболее частые ошибки
- Топ ошибок по количеству повторений
- Группировка по типам событий
- Фильтры по базе, пользователю, временному диапазону
- Тренды появления ошибок
Технологический журнал
- Длительные операции — события с duration > порога
- Блокировки — события TLOCK, TTIMEOUT, TDEADLOCK
- SQL запросы — события DBMSSQL, DBPOSTGRS с текстом запросов и планами
- Исключения — события EXCP с контекстом выполнения
Проблема: Docker контейнеры не запускаются или падают сразу после старта.
Решение:
- Проверьте пути в
deploy/docker/.env— они должны существовать на хосте - Убедитесь, что Docker Desktop запущен
- Проверьте логи:
docker logs 1c-log-parser,docker logs 1c-log-mcp - Проверьте, что порты 8123, 9000, 3000, 8080 не заняты другими процессами
Проблема: После запуска парсера таблицы в ClickHouse пустые.
Решение:
- Проверьте логи парсера:
docker logs 1c-log-parser - Убедитесь, что пути к логам в
LOG_DIRSиTECHLOG_DIRSправильные и доступны - Проверьте, что логи 1С действительно существуют по указанным путям
- Убедитесь, что парсер имеет права на чтение файлов логов
- Проверьте переменную
READ_ONLY— она должна бытьfalseдля записи в ClickHouse
Проблема: В логах и интерфейсе отображаются GUID вместо человекочитаемых имен.
Решение:
- Проверьте, что файл
configs/cluster_map.yamlсуществует в корне проекта - Убедитесь, что структура YAML правильная (см.
configs/cluster_map.yaml.example) - Проверьте, что GUID в файле соответствуют реальным GUID ваших кластеров и баз
- Перезапустите MCP-сервер после изменения
cluster_map.yaml
Проблема: AI-агент не может подключиться к MCP-серверу.
Решение:
- Проверьте, что MCP-сервер запущен:
docker ps | grep mcp - Проверьте порт 8080:
curl http://localhost:8080/health(должен вернуть{"status":"ok"}) - Проверьте логи:
docker logs 1c-log-mcp - Убедитесь, что в
mcp.jsonуказан правильный URL или команда запуска - Для STDIO режима проверьте переменную окружения
MCP_MODE=stdio
Проблема: Парсер не находит файлы технологического журнала.
Решение:
- Проверьте путь в
TECHLOG_DIRSв.env - Убедитесь, что файл
logcfg.xmlсуществует и правильно настроен - Проверьте, что 1С действительно создает файлы логов по указанному пути
- Проверьте права доступа к каталогу с логами
Проблема: 1С не создает файлы технологического журнала.
Решение:
- Проверьте настройки
conf.cfg— важно: первичный файл находится в каталоге конкретной версии платформы, например:А не вC:\Program Files\1cv8\8.3.27.1719\bin\conf\conf.cfgC:\Program Files\1cv8\conf\ - Убедитесь, что в
conf.cfgуказан параметрConfLocationс правильным путем - Проверьте, что путь в
ConfLocationсовпадает сTECHLOG_CONFIG_DIRиз.env - Убедитесь, что файл
logcfg.xmlсуществует по указанному пути - Перезапустите сервер 1С после изменения конфигурации
- Проверьте логи сервера 1С на наличие ошибок чтения конфигурации
- README для AI-агентов — детальная техническая информация для разработки и использования
- Спецификация — полная спека проекта (Requirements/Design/Tasks)
- Исходный запрос — детальное описание требований
- Получение GUIDов — как узнать GUID кластера/базы
- Настройка logcfg.xml — конфигурация технологического журнала
- Использование MCP tools — примеры запросов, режимы, best practices
- Нормально донастроить Дашборды в Графана
- Сделать корректную нормализацию для tech_log (самому глазами проверить все поля или найти готовое)
- Добавить работу с логами PostgreSQL
- Добавить работу с логами MS SQL
- Создать навык для работы с "MS SQL/PostgreSQL в контексте 1С" (блокировки, RCSI, оптимизация)
- Для работы в среде нескольких кластеров нужно:
- маунтить каталоги
C:\Program Files\1cv8\srvinfoкаждого сервера отдельно, а в коде реализовать параллельное чтение по всем каталогам с маской /mnt/logs_{ИмяСервераИлиИнойИдентификатор} - ✅ писать технологический журнал можно в один "общий" каталог, потому что имя формируется как /{clusterID}/{baseID}/
- logcfg.xml от каждого кластера нужно как то иначе хранить... например в srvinfo и переделать участки где происходит обращение к нему
- маунтить каталоги
См. подробнее:
Логика парсинга файлов журнала регистрации (.lgp) заимствована из проекта OneSTools.EventLog (автор: akpaevj).
Использованы следующие компоненты:
- Структура полей записи журнала регистрации
- Алгоритм парсинга многострочных записей с отслеживанием баланса скобок
- Маппинг значений (уровни событий, приложения, типы событий)
- Парсинг транзакций из hex-формата
- Обработка сложных структур данных
Проект распространяется под лицензией для некоммерческого использования. Использование в коммерческих целях требует согласования с автором.
Для некоммерческого использования: свободное использование, модификация и распространение.
Логика парсинга файлов журнала регистрации (.lgp) заимствована из проекта OneSTools.EventLog (автор: akpaevj).
В частности, использованы:
- Структура полей записи журнала регистрации
- Алгоритм парсинга многострочных записей с отслеживанием баланса скобок
- Маппинг значений (уровни событий, приложения, типы событий)
- Парсинг транзакций из hex-формата
- Обработка сложных структур данных
См. подробнее: docs/changelog/lgp-parser-enhancement.md
Для коммерческого использования: свяжитесь с автором для обсуждения условий.