Клиент требует вернуть «пропавший» заказ, менеджер клянётся, что ничего не трогал, а скидка в карточке товара оказалась 90% вместо 9%. В каждой такой ситуации первый вопрос руководителя один и тот же: кто, что и когда сделал в системе. Если у веб-приложения нет журнала действий пользователей — аудиторского лога, — ответа не будет: останутся версии, догадки и испорченные отношения с клиентами или сотрудниками. В этой статье разбираем, зачем бизнесу аудит-лог, какие операции стоит фиксировать и как реализовать журнал изменений в приложении на NestJS и Prisma — с рабочими фрагментами кода.
Что такое аудит-лог и чем он отличается от технических логов
Технические логи пишут для разработчиков: ошибки, стек-трейсы, время ответа сервера. Аудит-лог — журнал для бизнеса, и каждая его запись отвечает на пять вопросов: кто (ID пользователя и его роль), что (сущность и операция — например, «изменил заказ №4821»), когда (время с таймзоной), откуда (IP-адрес и устройство) и как было и как стало (старое и новое значение полей). Важное свойство журнала — неизменяемость: записи только добавляются, редактировать и удалять их нельзя даже администраторам системы. Иначе аудит-лог теряет доказательную силу: любая правка превращает его из документа в набор мнений.Зачем бизнесу журнал действий: пять рабочих сценариев
Аудит-лог редко входит в первые требования к продукту, но именно он выручает в самых дорогих ситуациях — конфликтах, утечках и разбирательствах.- Споры с сотрудниками и клиентами. «Я ничего не менял» перестаёт быть аргументом: журнал показывает, кто и когда скорректировал цену, статус или реквизиты.
- Расследование инцидентов. При утечке данных или массовом удалении видно, с какого аккаунта и с какого IP это происходило.
- Контроль дисциплины. Сразу видно, кто систематически завышает скидки, обходит согласование или правит чужие сделки.
- Восстановление после ошибок. По значениям «до» можно откатить неудачное массовое изменение за минуты, а не восстанавливать весь день из бэкапа.
- Требования регуляторов. Для систем с персональными данными (152-ФЗ, приказы ФСТЭК) и в отраслях с лицензированием фиксация действий пользователей — ожидаемая мера защиты.
Что фиксировать, а что — нет
Главная ошибка — писать всё подряд: журнал на миллионы записей, из которых 90% — шум, стоит денег и не читается. Фиксируйте:- изменения критичных сущностей — заказы, платежи, документы, реквизиты, цены;
- изменение прав и ролей, создание и блокировку пользователей;
- входы в систему и неудачные попытки авторизации;
- удаление любых бизнес-данных;
- массовые операции и выгрузки данных — экспорт особенно важен при расследовании утечек.
Где перехватывать изменения: четыре подхода
Есть четыре места, где приложение может поймать факт изменения данных, и у каждого свои плюсы и минусы.- Триггеры на уровне БД. Надёжно — не пропустят ни одной записи, но не знают, какой пользователь инициировал изменение, и усложняют миграции.
- Расширение клиента Prisma ($extends). Один слой на все операции с базой — минимальный шанс что-то забыть.
- Интерцепторы NestJS. Знают контекст HTTP-запроса, но пропустят изменения из фоновых задач и скриптов.
- Явные вызовы AuditService. Полный контроль над тем, что и зачем логировать, но требует дисциплины — в новом коде легко забыть добавить вызов.

