Сервис для парсинга журналов регистрации и технологического журнала 1С:Предприятие с загрузкой в ClickHouse. Предоставляет визуализацию в Grafana и MCP-интерфейс для AI-агентов.
📘 Для AI-агентов: См. README_AI.md — детальная техническая информация для разработки и использования проекта.
Этот проект обеспечивает: - Парсинг логов 1С (журнал регистрации .lgf/.lgp и технологический журнал) - Хранение в ClickHouse с партиционированием и TTL - Визуализацию в Grafana (дашборды активности, ошибок, новых проблем) - MCP-интерфейс для AI-агентов (компактный/полный JSON)
.lgf, .lgp, .lgxevent_log, tech_log - для хранения результатов парсингаfile_reading_progress - информация о прогрессе чтения файлов логовparser_metrics_extended - контроль/анализ производительностиЧтение логов:
- ✅ 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
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
#установите вашу тайм-зону (читай раздел специфика работы со временем)
TZ=Europe/Moscow
Переопределите место хранения конфигурации технологического журнала (сервис не может работать с системной директорией). По-умолчанию я предлагаю его поместить в каталоге проекта. Файл будет создан в /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 для ТЖ - ключевые знания по работе с ТЖ
Если MCP-клиент запускается в отдельном Docker-контейнере, ему нужен сетевой доступ к контейнеру 1c-log-mcp.
Специальный случай: если используется проект https://github.com/SteelMorgan/1c-ai-sandbox-client-server, контейнер 1c-log-mcp должен быть подключён к сети infra, чтобы локальный AI-контейнер мог обращаться к MCP по имени контейнера, например http://1c-log-mcp:8080.
Во всех остальных случаях управление сетевой связностью между Docker-контейнерами остаётся на вас и вашем AI-агенте: обеспечьте маршрут и DNS/hostname между контейнером с AI и контейнером 1c-log-mcp удобным для вашей инфраструктуры способом.
# HTTP
{
"mcpServers": {
"1c-log-checker": {
"url": "http://localhost:8080",
"transport": "http"
}
}
}
Примечание: если клиент работает не на хосте, а внутри Docker-сети, вместо localhost может понадобиться имя контейнера или иной адрес, доступный из сети этого клиента.
# 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",
"CLICKHOUSE_USER": "logchecker",
"CLICKHOUSE_PASSWORD": "logchecker"
}
}
}
}
Важно: в текущем Docker-окружении удалённые подключения под пользователем default могут завершаться AUTHENTICATION_FAILED. Для контейнерных подключений используйте сервисного пользователя logchecker.
⚠️ ОБЯЗАТЕЛЬНО: Для работы сервиса требуется создать папку configs в корне проекта (если её нет) и разместить там файл cluster_map.yaml. Образец файла находится в configs/cluster_map.yaml.example. Подсказка агенту куда смотреть в описании инструментов.
Это необходимо, чтобы агент знал GUID базы/кластера, с которыми работает в проекте, и мог обращаться за логами конкретной базы.
Шаги:
1. Создайте папку configs в корне проекта (если её нет)
2. Скопируйте образец: configs/cluster_map.yaml.example → configs/cluster_map.yaml
3. Отредактируйте 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 или любой другой удобный для вас способ (в гугле много вариантов) Альтернативный вариант - посмотреть данные в таблице logs.file_reading_progress после запуска сервиса парсера
docker-compose.yml использует внешние (external) ресурсы, которые нужно создать до первого запуска:
| Ресурс | Тип | Откуда берётся | Зачем |
|---|---|---|---|
infra |
network | Общая сеть для связи между Docker-стеками | MCP-сервер доступен другим контейнерам по имени 1c-log-mcp |
agent-work-sandbox-1c |
volume | Devcontainer (создаётся автоматически) | SSH-ключ для sshfs в devcontainer-окружении |
# Создать сеть (если не существует):
docker network create infra
# Volume agent-work-sandbox-1c нужен ТОЛЬКО в devcontainer-окружении.
# На обычном хосте (Windows/Linux) удалите секцию work_data из docker-compose.yml
# и укажите путь к SSH-ключу напрямую через ONEC_SSH_KEY в .env.
Примечание: если вы запускаете проект НЕ из devcontainer, уберите volume
work_dataизdocker-compose.ymlи замените mount SSH-ключа на прямой bind mount файла.
cd deploy/docker
docker compose up -d
# или через Makefile:
make infra-up
| Переменная | Описание | По умолчанию |
|---|---|---|
LOG_DIRS |
Пути к каталогам журнала регистрации (через ;) |
- |
TECHLOG_DIRS |
Пути к каталогам технологического журнала (через ;) |
- |
CLICKHOUSE_HOST |
Хост ClickHouse | localhost |
CLICKHOUSE_PORT |
Порт ClickHouse | 9000 |
CLICKHOUSE_DB |
База данных ClickHouse | logs |
CLICKHOUSE_USER |
Пользователь ClickHouse | logchecker |
CLICKHOUSE_PASSWORD |
Пароль ClickHouse | logchecker |
LOG_RETENTION_DAYS |
Срок хранения логов (дни) | 30 |
READ_ONLY |
Технический режим (только чтение, без записи в CH) | false |
MCP_PORT |
Порт MCP-сервера | 8080 |
MAX_WORKERS |
Количество параллельных потоков внутри каждого reader/tailer | 4 |
MAX_GLOBAL_WORKERS |
Глобальный лимит параллельных воркеров (<=0 отключает лимит) | 0 |
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: настраиваем
$ claude mcp add 1c-log-checker \
-- python -m otcore.mcp_server <graph>