Перейти к содержимому

Журнал обмена - как читать и что означают его сообщения

Читаем журнал обмена с учётной системой и понимаем, на чьей стороне произошёл сбой.

Решение

Находим журнал и смотрим последние записи:

Окно терминала
ls -lht /home/bitrix/www/upload/1c_catalog/ | head -5 # свежие файлы обмена сверху
tail -60 /home/bitrix/www/upload/1c_catalog/1c_exchange.log 2>/dev/null
tail -40 /home/bitrix/www/upload/1c_exchange.log 2>/dev/null
# путь зависит от типа обмена: каталог и заказы пишут в разные файлы

Журнал обмена живёт рядом с файлами выгрузки, а не в интерфейсе админки. Его включают настройкой модуля, и на боевом сайте он должен быть включён всегда: разбирать обмен без него нечем.

Читаем служебные слова в ответах:

Окно терминала
grep -E '^(success|progress|failure)' \
/home/bitrix/www/upload/1c_catalog/1c_exchange.log | tail -20
# progress означает «шаг закончен, присылай следующий запрос»
grep -c '^failure' /home/bitrix/www/upload/1c_catalog/1c_exchange.log

Ответы сайта начинаются служебным словом: успех, продолжение или отказ. Строка с отказом содержит текст ошибки следом, и именно она отвечает на вопрос, что пошло не так.

Смотрим ответы сайта в журнале веб-сервера:

Окно терминала
grep '1c_exchange.php' /var/log/nginx/access.log | tail -20 | awk '{print $9, $7}'
# коды 200 при пустых ответах и коды 500 - две разные истории

Журнал веб-сервера показывает то, чего нет в журнале обмена: коды ответов и их размер. Отказ по правам, обрыв по времени и пустой отбор различаются здесь мгновенно.

Отделяем свою ошибку от чужой:

// ошибки платформы при разборе файла обмена пишутся в журнал событий
$res = CEventLog::GetList(['ID' => 'DESC'], ['AUDIT_TYPE_ID' => 'CATALOG_IMPORT1C']);
while ($row = $res->Fetch()) {
printf("%s %s\n", $row['TIMESTAMP_X'], mb_substr($row['DESCRIPTION'], 0, 80));
}

Ошибка сайта видна в его журналах, ошибка учётной системы - только в её сообщении. Фраза «ошибка при обмене» без указания стороны почти всегда означает, что журналы не читали ни там, ни там.

Пустой журнал означает, что обмен не начинался. Учётная система не достучалась до сайта либо не отправила ни одного файла: разбирать в этом случае нужно доступ к точке обмена, а не настройки каталога.

Разбор сбоя по журналам идёт в одном порядке: сначала журнал доступа веб-сервера, потом журнал обмена, потом журнал событий платформы. Первый отвечает на вопрос «дошёл ли запрос», второй - «что сайт ответил», третий - «что при этом сломалось внутри».

Журнал растёт и не чистится сам. На сайте с ежечасным обменом он за месяц превращается в файл на несколько гигабайтов, поэтому его включают в ротацию наравне с журналами веб-сервера.

Типичные проблемы

Журнала обмена нет вовсе.

Он выключен в настройках модуля. Без него разбирать обмен приходится по журналам веб-сервера и учётной системы.

В журнале только успехи, а данных нет.

Обмен проходит с пустым отбором. Сайт честно отвечает успехом на пустой файл.

Учётная система сообщает об ошибке, журнал сайта чист.

Запрос не дошёл до платформы: его отклонил веб-сервер или сеть. Это видно в журнале доступа веб-сервера.

Журнал занял всё место на диске.

У него нет ротации. Файл растёт бесконечно и на частом обмене становится самым большим на сервере.

Ошибка есть, но без подробностей.

Часть сообщений обрезается в интерфейсе. Полный текст лежит в файле журнала.

Частые вопросы

Где смотреть журнал обмена заказами?

Там же, рядом с файлами обмена, но у заказов свой файл. Каталог и заказы пишут в разные журналы.

Стоит ли держать журнал включённым постоянно?

Да, на боевом сайте это единственный способ разобрать сбой задним числом. Место решается ротацией, а не отключением.

Как понять, что обмен вообще запускался?

По журналу доступа веб-сервера: там видны все обращения к точке обмена. Отсутствие обращений означает, что учётная система не начинала.

Почему в журнале русский текст превращается в мусор?

Файл пишется в кодировке сайта, а читается в другой. Смотрят с явным указанием кодировки, а не переносят файл как есть.

Смежное

Первоисточник