Хватит логгировать как в каменном веке 🪵

Коллеги, вы всё ещё логируете через $modx->log()? Тогда знаете боль: всё валится одной кучей в core/cache/logs/error.log — ваши записи, чужие записи, варнинги ядра, — без тэгов, без контекста, без ротации. А когда у клиента «что-то сломалось», вы идёте ssh-иться и грепать. У нас есть mxLogger, адаптированный под MODX 3 — забирайте в свои пакеты.

Тэги — это не «ещё одна колонка для фильтра»
  • Тэг связывает цепочку вызовов одной фичи или пакета в единый поток. Расставили по своему коду тэг «mycart» — и в менеджере одним кликом видите весь ход этой функциональности по порядку, а не выковыриваете свои строки из общей помойки лога.
  • Тэгов на запись может быть несколько — например «cart» и «purchase». Одна запись попадает сразу в несколько срезов.

Процесс — склейка РАЗНЫХ цепочек в одну операцию
  • Одна покупка — это обычно несколько цепочек: корзина, заказ, оплата (часто из разных пакетов). Процесс даёт им общий process_uid и собирает всё в одну ленту одного экземпляра — читаете как историю конкретной покупки от и до, сквозь все пакеты.

Алерты: узнавайте об ошибках сразу, а не от клиента
  • Событие mxlOnAfterLogSave срабатывает после каждой записи. Вешаете на него плагин, проверяете уровень — и при «error» шлёте письмо, в Telegram или любой мессенджер. Лог не просто копится в углу, а сам стучится, когда что-то сломалось.
  • Событие mxlOnBeforeLogSave — до записи: можно отменить запись или на лету поправить поля. Ошибки в обработчиках перехватываются и сам логгер не роняют.
// плагин на событие mxlOnAfterLogSave
  if (($scriptProperties['level'] ?? '') === 'error') {
      // ваша отправка: письмо / Telegram Bot API / Slack / ...
      sendAlert($scriptProperties['message'], $scriptProperties['tags_list'] ?? [], $scriptProperties['id']);
  }

Отладка на работающем проде — без флуда
  • Whitelist-фильтры записи: можно писать логи только для конкретного пользователя, группы, сессии или куки. Включили запись на свой аккаунт — отлаживаете боевой сайт, не засыпая базу чужими логами и не трогая остальных.
  • Пользователь, сессия, ip и время пишутся автоматически к каждой записи — не надо тащить их руками.

Логи не испаряются с кэшем
  • Штатный error.log живёт в core/cache/logs/ — сбросили кэш (а это происходит постоянно), и логов нет. mxLogger пишет в таблицу БД: записи переживают сброс кэша, а сколько их хранить — настраиваете сами через
    mxlogger.log_lifetime
    (старьё чистится ротацией автоматически).

Чем ещё лучше штатного логгера MODX 3
  • Контекст и источник. Кладёте в лог массив данных (JSON-колонка); «Источник» (класс/метод/файл/строка) и стэк ловятся сами, с пропуском диспетчерских кадров — видно реальный ваш
    код, а не
    modScript::process
    .
  • Менеджерный грид. Фильтры по тэгу/уровню/процессу/пользователю/дате/тексту, окно детали, клик по значению — фильтрует.
  • Доступ в обход MODX. Сломался сам сайт — логи всё равно почитаете:
    standalone.php
    читает базу напрямую. Есть CLI (по ssh) и веб-интерфейс (по ключу), оба мимо ядра MODX.

Добавить логирование в свой пакет — три строки
В MODX 3 сервис берётся из контейнера:
$mxl = $modx->services->get('mxlogger');
$mxl->info('mypackage', 'Что-то началось', ['id' => $id]);
$mxl->error('mypackage', 'Что-то отвалилось', ['code' => $code]);

// одна операция сквозь несколько цепочек — общий process_uid:
$p = $mxl->process(['cart', 'purchase']);
$p->info('Старт оплаты', ['order' => 42]);
$p->error('Платёж отклонён', ['code' => 'declined']);

И из чанка/Fenom, если надо:
[[!mxLogger? &tags=mypackage &level=info &message=Готово]]
Тэги — латиница и цифры в нижнем регистре. Уровни: «debug», «info», «warning», «error». Логируете через свою обёртку над сервисом? Передайте её класс в
skip_classes
— и «Источник» покажет ваш код, а не обёртку.
Ставьте mxLogger зависимостью, тэгайте свои цепочки, заводите процессы, вешайте алерты на «error» — и будущий вы (и саппорт) скажет спасибо. error.log пусть отдохнёт 🙏
Артур Шевченко
Сегодня в 00:48
modx.pro
167
+6
Поблагодарить автора Отправить деньги

Комментарии: 1

Ivan K.
3 часа назад
0
Думаю очень полезный компонент получился, спасибо Артур. Установил на новый проект, буду тестировать)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1