Логи платформы 1С 8.3: настройка logcfg.xml, разбор событий и поиск причин тормозов
Содержание
Технологический журнал 1С включается файлом logcfg.xml в каталоге conf платформы (обычно C:\Program Files\1cv8\conf\). Через минуту после сохранения файла платформа начинает писать текстовые логи в указанную папку: по подкаталогу на каждый процесс и по файлу на каждый час. Читают их построчно: одна строка — одно событие с длительностью, типом и набором свойств.
Чаще всего к журналу приходят с конкретной болью: база тормозит, пользователи ловят Конфликт блокировок при выполнении транзакции, рабочий процесс падает без внятной ошибки. Решение почти всегда одно: собрать узкий набор событий на час-два, не забив диск, и найти виновника по длительности и контексту.
Технологический журнал и журнал регистрации: в чём разница
Эти два журнала путают постоянно, хотя отвечают они на разные вопросы.
| Журнал регистрации | Технологический журнал | |
|---|---|---|
| Что пишет | Действия пользователей: вход, запись документа, ошибки прикладного кода | Работу платформы: запросы к СУБД, блокировки, вызовы сервера, исключения |
| Включён по умолчанию | Да | Нет, только после создания logcfg.xml |
| Кто настраивает | Администратор базы в Конфигураторе | Администратор сервера, правкой файла |
| Где смотреть | В самой 1С, с отбором | В текстовых файлах, внешними средствами |
| Объём | Умеренный | От мегабайт до десятков гигабайт в час |
Правило выбора простое:
- 👤 «Кто удалил документ и когда» — это журнал регистрации.
- 🐢 «Почему проведение идёт 40 секунд» — это технологический журнал.
- 🔒 «Кто держит блокировку» — технологический журнал, события
TLOCKиTTIMEOUT. - 💥 «Почему вылетает клиент» — сначала журнал регистрации, потом ТЖ с событием
EXCP.
Как хранятся файлы журналов 1С на диске
Журнал регистрации
У файловой базы журнал лежит в подкаталоге 1Cv8Log внутри папки базы. У серверной — в каталоге кластера, по умолчанию C:\Program Files\1cv8\srvinfo\reg_1541\<GUID базы>\1Cv8Log.
Форматов два:
- 📦
1Cv8.lgd— одна файловая база SQLite. Удобна для отборов, но растёт одним большим файлом. - 📄
1Cv8.lgfплюс набор*.lgp— последовательный формат. Файлыlgpможно делить по периодам и архивировать старые.
Уровень записи (не записывать, ошибки, предупреждения, информация, примечания) и деление на периоды задают в Конфигураторе: Администрирование → Настройка журнала регистрации.
Технологический журнал
Структура папки, которую вы указали в logcfg.xml, выглядит так:
D:\TJ\slow\
rphost_4512\
26101709.log
26101710.log
rmngr_3120\
26101710.log
ragent_2208\
26101710.log
Имя подкаталога — это имя процесса и его PID: rphost (рабочий процесс), rmngr (менеджер кластера), ragent (агент), 1cv8c или 1cv8 (клиенты, если журнал включён на клиентской машине). Имя файла — дата и час в формате ГГММДДЧЧ: файл 26101710.log содержит события 17 октября с 10:00 до 10:59.
Несмотря на «журнал в XML», сами логи — не XML. В XML написан только файл настройки. Логи — обычный текст в UTF-8, который открывается любым редактором.
Как читать одну строку события
Пример строки (перенесён для читаемости):
12:37.842015-2304511,DBMSSQL,5,process=rphost,p:processName=buh_prod,
OSThread=7140,t:clientID=118,t:applicationName=1CV8C,t:computerName=PC-ACC-07,
t:connectID=2214,SessionID=37,Usr=Иванова,Trans=1,dbpid=64,
Sql='SELECT ... FROM _AccRg1234 T1 WITH(NOLOCK) ...',Rows=18734,
Context='Документ.РеализацияТоваровУслуг.МодульОбъекта : 512 : ...'
Разбор по частям:
12:37.842015— минуты, секунды и микросекунды. Час берётся из имени файла.-2304511— длительность в микросекундах, здесь около 2,3 секунды.DBMSSQL— тип события: запрос к MS SQL Server.5— уровень вложенности события в стеке вызовов.- Дальше пары
свойство=значение: имя базы (p:processName), пользователь (Usr), компьютер, номер соединения, текст запроса, число строк иContext— место в коде, откуда пришёл запрос.
Context — самое ценное свойство. По нему вы находите модуль и номер строки, а не гадаете, какой отчёт нагрузил базу.
Одно событие может занимать несколько физических строк: в Sql и Context бывают переносы. Новое событие всегда начинается с шаблона мм:сс.микросекунды-длительность. Это пригодится при разборе через командную строку.
Настройка logcfg.xml: что логировать и сколько хранить
Файл logcfg.xml создают в каталоге conf установленной платформы. На Windows это обычно C:\Program Files\1cv8\conf\ (действует для всех версий) или conf внутри каталога конкретной версии. На Linux — /opt/1cv8/conf/ или аналогичный каталог в папке версии.
Логика файла:
- 📁 элемент
<log>задаёт папку (location) и срок хранения в часах (history); - 🎯 элементы
<event>— какие события собирать. Условия внутри одного<event>объединяются через «И», разные<event>— через «ИЛИ»; - 📋
<property name="all"/>— писать все свойства события; - 🔍 операторы условий:
eq,ne,gt,ge,lt,le,like.
Длительность в условии duration задаётся в десятитысячных долях секунды: значение 10000 означает 1 секунду. В самих логах длительность пишется в микросекундах, не перепутайте.
Шаблон 1. Ошибки и исключения
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="D:\TJ\errors" history="72">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="QERR"/>
</event>
<property name="all"/>
</log>
</config>
Лёгкий журнал, который можно держать включённым постоянно: исключения платформы и ошибки компиляции запросов.
Шаблон 2. Медленные запросы к СУБД
<log location="D:\TJ\slow" history="24">
<event>
<eq property="name" value="DBMSSQL"/>
<gt property="duration" value="20000"/>
</event>
<event>
<eq property="name" value="DBPOSTGRS"/>
<gt property="duration" value="20000"/>
</event>
<property name="all"/>
</log>
Попадут запросы дольше 2 секунд. Чтобы ограничить одну базу, добавьте в каждый <event> условие <eq property="p:processName" value="buh_prod"/>.
Шаблон 3. Блокировки
<log location="D:\TJ\locks" history="12">
<event><eq property="name" value="TLOCK"/></event>
<event><eq property="name" value="TTIMEOUT"/></event>
<event><eq property="name" value="TDEADLOCK"/></event>
<property name="all"/>
</log>
TLOCK в нагруженной базе пишется очень часто, поэтому срок хранения здесь короткий.
Несколько <log> можно держать в одном файле, но каждый — со своей отдельной папкой. Платформа сама удаляет устаревшие файлы в location, поэтому не указывайте каталог, где лежит что-то ещё.
Платформа перечитывает logcfg.xml примерно раз в минуту, перезапуск службы не нужен. Чтобы выключить журнал, удалите или переименуйте файл.
Что видно без технологического журнала: журнал регистрации и консоль кластера
Прежде чем включать ТЖ, проверьте, не хватит ли встроенных средств.
Отборы в журнале регистрации
В БП 3.0, ЗУП 3.1 и УТ 11 журнал открывается через Администрирование → Обслуживание, ссылка «Журнал регистрации». Универсальный путь для любой конфигурации — Все функции → Стандартные → Журнал регистрации (пункт «Все функции» включается в параметрах программы).
Кнопка «Установить отбор» даёт фильтры:
- 📅 период — сужайте до часа вокруг сбоя, иначе журнал открывается минутами;
- 👤 пользователь и компьютер;
- ⚠️ важность: ошибки, предупреждения, информация, примечания;
- 🏷 событие: например, «Данные. Удаление» или «Сеанс. Начало»;
- 🧩 метаданные: конкретный вид документа или справочника;
- 🔢 сеанс — номер, который удобно сверять с консолью кластера.
Двойной щелчок по строке открывает подробности: там полный текст ошибки со стеком и ссылка на объект. Текст ошибки отсюда копируйте дословно, когда ищете решение.
Консоль администрирования серверов 1С
Консоль кластера не показывает содержимое ТЖ, но в реальном времени отвечает на вопросы «кто сейчас в базе» и «что держит». У каждой информационной базы есть ветки:
- «Сеансы» — пользователь, компьютер, приложение, время начала, захваченная лицензия.
- «Соединения» — какие соединения открыты к рабочим процессам.
- «Блокировки» — текущие управляемые блокировки и сеанс, который их держит.
У рабочих процессов в консоли видна занятая память и доступная производительность. Если один rphost раздувается по памяти, именно его PID ищите потом в имени папки ТЖ.
Для серверов без графической консоли то же самое отдаёт утилита rac: rac cluster list выведет кластеры, rac session list --cluster=<UUID> — сеансы. Остальные параметры смотрите в справке rac help.
Чем анализировать технологический журнал
Открывать гигабайтный лог блокнотом бессмысленно. Рабочих подходов четыре.
| Способ | Когда подходит | Минусы |
|---|---|---|
grep/awk на Linux или WSL | Быстрый разовый разбор, топ медленных запросов | Нужна сборка многострочных событий |
PowerShell (Select-String) | Сервер на Windows без дополнительного ПО | Медленно на десятках гигабайт |
| ЦУП из комплекта КИП 1С | Регулярный мониторинг, есть лицензия КИП | Платный, требует развёртывания |
| ELK, Graylog, ClickHouse | Постоянный сбор с нескольких серверов | Нужно настроить парсинг формата |
Топ медленных запросов одной командой
Сначала склеиваем многострочные события в одну строку, затем берём DBMSSQL и сортируем по длительности:
cd /mnt/d/TJ/slow
awk '/^[0-9][0-9]:[0-9][0-9]\.[0-9]+-[0-9]+,/{ if (e) print e; e=$0; next } { e=e" "$0 } END { if (e) print e }' rphost_*/*.log \
| grep ',DBMSSQL,' \
| sed -E 's/^[0-9:.]+-([0-9]+),/\1\t&/' \
| sort -t$'\t' -k1,1nr \
| head -20
В первой колонке окажется длительность в микросекундах. Дальше смотрите Context у верхних строк: если пять из двадцати запросов идут из одного модуля, оптимизировать нужно его.
Для PowerShell быстрый поиск по ошибкам за час:
Select-String -Path 'D:\TJ\errors\rphost_*\26101710.log' -Pattern ',EXCP,' |
Select-Object -First 50 |
ForEach-Object { $_.Line }
Ключевые события технологического журнала и что они значат
| Событие | Что это | На что смотреть |
|---|---|---|
EXCP | Исключение в процессе платформы | Exception, Descr — текст ошибки |
QERR | Ошибка компиляции запроса | Текст запроса и Context |
DBMSSQL / DBPOSTGRS | Запрос к MS SQL Server / PostgreSQL | duration, Sql, Rows, Context |
SDBL | Запрос на языке 1С до трансляции в SQL | Длительность и текст запроса 1С |
CALL / SCALL | Вызов сервера от клиента / внутри кластера | Длительность, память, Context |
TLOCK | Управляемая блокировка | Regions, Locks, WaitConnections |
TTIMEOUT | Превышено время ожидания блокировки | WaitConnections — кто мешал |
TDEADLOCK | Взаимоблокировка | DeadlockConnectionIntersections |
CONN / SESN | Соединения и сеансы | Обрывы, кто подключался |
PROC | Старт и остановка процессов | Внезапные перезапуски rphost |
Как отличить проблему СУБД от проблемы кода
Сравните длительность CALL и сумму DBMSSQL внутри него. Если вызов шёл 30 секунд, а запросы к базе — 2 секунды, время ушло на обработку данных в коде 1С: циклы, обращения через точку, построение таблиц в памяти. Если наоборот, почти все 30 секунд — это SQL, и смотреть нужно на индексы, статистику и сам запрос.
Признак неудачного запроса — большое Rows при маленьком результате на экране: запрос выбрал 200 тысяч строк, а пользователь увидел отчёт на одну страницу.
Сценарии поиска проблем по технологическому журналу
Тормозит проведение одного документа
- Включите шаблон медленных запросов с порогом 1 секунда (
value="10000") и отбором по базе. - Попросите пользователя провести документ и запишите точное время.
- Откройте файл нужного часа, найдите события с
Usrэтого пользователя в эту минуту. - По
Contextопределите модуль и строку, поSql— какую таблицу читает запрос. - Выключите журнал, переименовав
logcfg.xml.
Пользователи получают ошибку блокировки
Текст ошибки обычно такой: Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки.
- Включите шаблон блокировок.
- Дождитесь повторения и найдите событие
TTIMEOUT. - Возьмите из него
WaitConnections— номер соединения-виновника. - Найдите
TLOCKс этимt:connectIDза предшествующие секунды: вRegionsбудет пространство блокировки (например, регистр остатков), вContext— код, который её поставил. - Сверьте номер соединения с веткой «Соединения» в консоли кластера, чтобы понять, чей это сеанс.
Чаще всего виновник — долгая транзакция: обработка, которая проводит сотни документов в одной транзакции, или регламентное задание, совпавшее по времени с закрытием месяца.
Падает рабочий процесс
- Включите шаблон ошибок, добавив событие
PROC. - После падения найдите в папке
rphost_<PID>последниеEXCPпередPROCс остановкой. - Для глубокого разбора включите дамп:
<dump create="true" location="D:\TJ\dumps"/>— файлы.mdmpпригодятся при обращении в поддержку.
Дампы и полный журнал TLOCK занимают много места — включайте их на время поиска и сразу выключайте.
Если журнал пуст при включённом logcfg.xml, проверьте три вещи: файл лежит именно в том conf, который читает работающая версия платформы; у учётной записи службы есть права на запись в папку логов; XML корректен (одна незакрытая кавычка — и платформа молча игнорирует файл).
Частые вопросы
Нагружает ли технологический журнал сервер?
DBMSSQL без отбора и TLOCK в нагруженной базе заметно загружает диск, поэтому их включают на часы, а не на недели.Можно ли включить журнал только на одном компьютере пользователя?
logcfg.xml в каталоге conf платформы на этом компьютере — журнал будет писать клиентский процесс, и в папке появятся подкаталоги 1cv8c_<PID>.Почему в журнале нет часа события?
26101710.log — это 17 октября, 10-й час. В строке только минуты, секунды и микросекунды.Как посмотреть журнал регистрации без запуска 1С?
lgd — база SQLite, её открывает любой просмотрщик SQLite. Но удобнее подключиться к базе и открыть журнал через «Все функции»: там уже работают отборы и расшифровка событий.