Логи платформы 1С 8.3: настройка logcfg.xml, разбор событий и поиск причин тормозов

· 10 мин

Содержание

Технологический журнал 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 : ...'

Разбор по частям:

  1. 12:37.842015 — минуты, секунды и микросекунды. Час берётся из имени файла.
  2. -2304511 — длительность в микросекундах, здесь около 2,3 секунды.
  3. DBMSSQL — тип события: запрос к MS SQL Server.
  4. 5 — уровень вложенности события в стеке вызовов.
  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 примерно раз в минуту, перезапуск службы не нужен. Чтобы выключить журнал, удалите или переименуйте файл.

Перед включением ТЖ на рабочем сервере
Выполнено: 0 / 6

Что видно без технологического журнала: журнал регистрации и консоль кластера

Прежде чем включать ТЖ, проверьте, не хватит ли встроенных средств.

Отборы в журнале регистрации

В БП 3.0, ЗУП 3.1 и УТ 11 журнал открывается через Администрирование → Обслуживание, ссылка «Журнал регистрации». Универсальный путь для любой конфигурации — Все функции → Стандартные → Журнал регистрации (пункт «Все функции» включается в параметрах программы).

Кнопка «Установить отбор» даёт фильтры:

  • 📅 период — сужайте до часа вокруг сбоя, иначе журнал открывается минутами;
  • 👤 пользователь и компьютер;
  • ⚠️ важность: ошибки, предупреждения, информация, примечания;
  • 🏷 событие: например, «Данные. Удаление» или «Сеанс. Начало»;
  • 🧩 метаданные: конкретный вид документа или справочника;
  • 🔢 сеанс — номер, который удобно сверять с консолью кластера.

Двойной щелчок по строке открывает подробности: там полный текст ошибки со стеком и ссылка на объект. Текст ошибки отсюда копируйте дословно, когда ищете решение.

Консоль администрирования серверов 1С

Консоль кластера не показывает содержимое ТЖ, но в реальном времени отвечает на вопросы «кто сейчас в базе» и «что держит». У каждой информационной базы есть ветки:

  1. «Сеансы» — пользователь, компьютер, приложение, время начала, захваченная лицензия.
  2. «Соединения» — какие соединения открыты к рабочим процессам.
  3. «Блокировки» — текущие управляемые блокировки и сеанс, который их держит.

У рабочих процессов в консоли видна занятая память и доступная производительность. Если один 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 / PostgreSQLduration, 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. Включите шаблон медленных запросов с порогом 1 секунда (value="10000") и отбором по базе.
  2. Попросите пользователя провести документ и запишите точное время.
  3. Откройте файл нужного часа, найдите события с Usr этого пользователя в эту минуту.
  4. По Context определите модуль и строку, по Sql — какую таблицу читает запрос.
  5. Выключите журнал, переименовав logcfg.xml.

Пользователи получают ошибку блокировки

Текст ошибки обычно такой: Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки.

  1. Включите шаблон блокировок.
  2. Дождитесь повторения и найдите событие TTIMEOUT.
  3. Возьмите из него WaitConnections — номер соединения-виновника.
  4. Найдите TLOCK с этим t:connectID за предшествующие секунды: в Regions будет пространство блокировки (например, регистр остатков), в Context — код, который её поставил.
  5. Сверьте номер соединения с веткой «Соединения» в консоли кластера, чтобы понять, чей это сеанс.

Чаще всего виновник — долгая транзакция: обработка, которая проводит сотни документов в одной транзакции, или регламентное задание, совпавшее по времени с закрытием месяца.

Падает рабочий процесс

  1. Включите шаблон ошибок, добавив событие PROC.
  2. После падения найдите в папке rphost_<PID> последние EXCP перед PROC с остановкой.
  3. Для глубокого разбора включите дамп: <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. Но удобнее подключиться к базе и открыть журнал через «Все функции»: там уже работают отборы и расшифровка событий.
Нужно ли перезапускать службу после правки logcfg.xml?
Нет. Платформа проверяет файл примерно раз в минуту и сама начинает или прекращает запись.