Свой журнал решения - файл, ротация, что писать
Заводим отдельный журнал для своего обмена или модуля, чтобы разбор сбоя занимал минуту, а не вечер с расспросами менеджеров.
Решение
Пишем в свой файл:
\Bitrix\Main\Diag\Debug::writeToFile( ['order' => $orderId, 'code' => $httpCode, 'ms' => $ms], date('Y-m-d H:i:s') . ' sync', '/local/logs/sync.log');// свой файл, а не общий журнал ошибок: чужие записи не мешают разборуУ своего решения свой журнал, а не общий на весь сайт. Смешанные записи превращают разбор в чтение чужих ошибок, а отдельный файл открывается и читается целиком.
Кладём в запись то, что нужно при разборе:
// что случилось, с чем именно, чем закончилось и сколько заняло$line = sprintf("%s order=%s action=%s result=%s ms=%d", date('c'), $orderId, 'send', $ok ? 'ok' : 'fail:' . $error, $ms);// по такой строке ищут grep-ом: заказ, действие, результат, времяЗапись отвечает на вопрос «что и с чем случилось». Строка без номера заказа и без результата не помогает: она сообщает, что код работал, но не говорит, чем всё кончилось.
Не даём файлу вырасти:
/home/site/local/logs/*.log { daily rotate 14 compress missingok}Файл журнала без ротации однажды съедает диск. Сначала он растёт незаметно, потом на нём падает база, и виноватым выглядит сайт, а не забытая настройка ротации.
Убираем из журнала лишнее:
$payload['token'] = '***'; // ключи в журнал не пишут никогдаunset($payload['phone'], $payload['email']); // персональные данные тоже лишниеDebug::writeToFile($payload, 'request', '/local/logs/sync.log');// на стенде эти же места удобнее смотреть пошаговым отладчикомЖурнал живёт дольше, чем кажется, и читают его люди, которым эти данные не нужны. Ключ, попавший в журнал, считается известным так же, как ключ в репозитории.
Уровни записей стоит завести с самого начала. Обычный ход обмена пишут коротко, а подробности - только при разборе: журнал, где каждая мелочь занимает десять строк, никто не читает.
Журнал полезно завести раньше первой ошибки. После сбоя он появляется всегда, но именно того запуска, который сломался, в нём уже нет.
Место журналов стоит держать одно на проект. Файлы, разбросанные по каталогам модулей, находят не с первого раза, а на боевом сайте это стоит времени.
Читать журнал стоит уметь до того, как он понадобится. Пара строк с командами поиска по номеру заказа и по результату, записанная рядом с решением, экономит полчаса в тот вечер, когда разбираться придётся кому-то другому.
Типичные проблемы
В журнале записи, но разобрать сбой нечем.
В строке нет ни номера заказа, ни результата операции. Запись обязана называть предмет и итог действия.
На сервере кончилось место.
Файл журнала растёт месяцами без всякой ротации и без всякой регулярной чистки. Ротацию файлов настраивают вместе с самим журналом, а не годом позже него.
В журнале нашлись ключи от чужого сервиса.
Тело запроса пишется в журнал целиком, вместе со всеми служебными заголовками доступа. Такие поля затирают в теле запроса ещё перед самой записью в журнал.
Нужного запуска в журнале нет.
Журнал завели уже после сбоя, при разборе. Он окупается только тогда, когда пишется заранее.
Журнал невозможно читать глазами.
Каждая мелочь пишется подробно и занимает по десять строк в самом журнале. Подробности включают только на время разбора.
Частые вопросы
Чем свой журнал лучше штатного журнала событий?
Он не смешан с чужими записями и читается обычными средствами. Штатный удобен для действий пользователей.
Где хранить файлы журналов?
В одном каталоге вне открытого снаружи, например рядом с кодом проекта. Каталог загрузок для этого не годится.
Сколько хранить записи?
Обычно две недели: этого хватает на разбор и не съедает диск. Важные события дублируют в свою таблицу.
Нужен ли журнал на стенде?
Нужен, и там он подробнее. На боевом сайте подробности включают только на время разбора.
Смежное
- События на практике - оглавление подтемы
- Логирование решения: логгер по стандарту, настройка, контекст - настраиваемый журнал вместо своего файла
- Журнал событий: чтение, очистка, свои записи - штатный журнал действий
- Ошибки в своём коде: результат вместо исключения, журнал, показ - откуда берутся записи об ошибках
- Отладка на боевом сайте: журналы, режим ошибок, поиск виновника - разбор сбоя целиком
- Очередь обмена со сторонней системой: задания, повторы, сверка - главный потребитель такого журнала
- Ядро D7 - устройство ядра целиком
- Отладчик на стенде: подключение, точки останова, обмен и cron - когда журнала уже мало