Хватит логгировать как в каменном веке 🪵
Коллеги, вы всё ещё логируете через $modx->log()? Тогда знаете боль: всё валится одной кучей в core/cache/logs/error.log — ваши записи, чужие записи, варнинги ядра, — без тэгов, без контекста, без ротации. А когда у клиента «что-то сломалось», вы идёте ssh-иться и грепать. У нас есть mxLogger, адаптированный под MODX 3 — забирайте в свои пакеты.
Тэги — это не «ещё одна колонка для фильтра»
Процесс — склейка РАЗНЫХ цепочек в одну операцию
Алерты: узнавайте об ошибках сразу, а не от клиента
Отладка на работающем проде — без флуда
Логи не испаряются с кэшем
Чем ещё лучше штатного логгера MODX 3
Добавить логирование в свой пакет — три строки
В MODX 3 сервис берётся из контейнера:
И из чанка/Fenom, если надо:
Тэги — это не «ещё одна колонка для фильтра»
- Тэг связывает цепочку вызовов одной фичи или пакета в единый поток. Расставили по своему коду тэг «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. Сломался сам сайт — логи всё равно почитаете:
читает базу напрямую. Есть CLI (по ssh) и веб-интерфейс (по ключу), оба мимо ядра MODX.standalone.php
Добавить логирование в свой пакет — три строки
В 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». Логируете через свою обёртку над сервисом? Передайте её класс вСтавьте mxLogger зависимостью, тэгайте свои цепочки, заводите процессы, вешайте алерты на «error» — и будущий вы (и саппорт) скажет спасибо. error.log пусть отдохнёт 🙏— и «Источник» покажет ваш код, а не обёртку.skip_classes
Поблагодарить автора
Отправить деньги
Комментарии: 1
Думаю очень полезный компонент получился, спасибо Артур. Установил на новый проект, буду тестировать)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.