Більшість пакетів для аудиту фіксують час зміни поля та автора правки. Проте вони часто втрачають зв'язок, якщо зміна відбувається через кілька етапів у чергах. Yammi Audit Log від RomaLytar розв'язує цю проблему: крім попередніх та нових значень, пакет записує виконавця, ініціатора та correlation ID, який об’єднує запит, Job, команду чи заплановане завдання в єдиний ланцюжок.
# Аудит без змін у моделях
Вам не потрібно додавати трейти, імплементувати інтерфейси чи реєструвати обсервери. Після встановлення пакета та запуску міграцій усі операції запису Eloquent фіксуються автоматично:
User::first()->update(['name' => 'Eric']);
Це оновлення потрапить до логу без жодних правок у моделі User. За замовчуванням відстежуються всі моделі, але у файлі config/audit-log.php можна активувати режим opt-in для обраного списку:
'capture' => ['mode' => env('AUDIT_LOG_CAPTURE_MODE', 'all')], // all | opt_in
'retention' => ['days' => env('AUDIT_LOG_RETENTION_DAYS', 180)],
'write' => ['async' => env('AUDIT_LOG_WRITE_ASYNC', false)],
Варто врахувати: оскільки пакет використовує події Eloquent, прямі оновлення через Query Builder автоматично не фіксуються — їх потрібно записувати окремо.
# Збереження ініціатора у чергах
Це головна перевага Yammi. Коли користувач запускає завдання, яке згодом змінює модель, звичайний аудит припише цю дію воркеру черги. Yammi передає ідентичність ініціатора через увесь ланцюжок, тому в логах чітко видно різницю між тим, хто виконав код, і тим, хто запустив процес. Correlation ID групує записи одного робочого циклу, дозволяючи відстежити каскад змін від контролера до Job або запланованої команди.
Крім того, система фіксує контекст виконання: HTTP-запит, Job, команда Artisan або Scheduler. Це допомагає зрозуміти, звідки саме прийшли зміни в модель.
# Продуктивність та стабільність
Процес запису спроєктовано так, щоб аудит не сповільнював роботу програми. Кожна зміна — це один запис в основну таблицю та пакетне додавання змінених полів у окрему індексовану таблицю. Такий підхід дозволяє швидко шукати за полями, не скануючи JSON-колонки. За потреби запис логів можна зробити асинхронним:
'write' => ['async' => env('AUDIT_LOG_WRITE_ASYNC', false)],
Логування працює за принципом fail-open: якщо під час запису аудиту виникне помилка, основна операція все одно буде завершена успішно.
# Форензика та відповідність вимогам
Yammi містить набір підсистем, які можна активувати за потреби. Режим цілісності додає ланцюжок хешів (tamper-evident hash chain) для виявлення маніпуляцій з історією, а функція Time Machine дозволяє відтворити стан запису на будь-який момент у минулому. Також передбачені інструменти для GDPR, виявлення аномалій, стрімінг у SIEM, сповіщення у Slack та підтримка multi-tenancy. Опціональна панель керування активується окремо:
composer require romalytar/yammi-audit-log-laravel
php artisan migrate
php artisan audit-log:ui enable
Завдяки модульності Yammi залишається легким інструментом для простого логування, але дозволяє нарощувати потужність там, де цього вимагає безпека чи законодавство.
Yammi працює на PHP 8.1+ та Laravel версій від 9 до 13. Документація та вихідний код доступні на GitHub.