Разработка модуля логирования 1С-Битрикс
Разбор инцидента на продакшне без нормальных логов — занятие мучительное. Стандартный \Bitrix\Main\Diag\Debug::writeToFile() пишет в плоский файл без структуры, без уровней, без ротации. Через неделю работы — файл на 2 ГБ, который невозможно ни проанализировать, ни найти нужную запись. Мы предлагаем модуль логирования, который решает эту проблему системно. Он записывает структурированные записи в БД, использует уровни severity, теги, контекст, ротацию и поиск через административный интерфейс. Это сокращает время поиска ошибок с часов до минут. Получите консультацию по внедрению модуля логирования в вашем проекте.
Почему стандартный логгер Битрикса не подходит?
Debug::writeToFile() смешивает в одном файле все события: отладочные, информационные и критические. Нет ротации — файл растёт до десятков гигабайт. Нет поиска — приходится использовать grep по огромному файлу. Нет уровней — невозможно отфильтровать только ошибки. Всё это превращает отладку в гадание. Наш модуль решает эти недостатки из коробки: структурированные записи в ORM, уровни PSR-3, разделение по каналам, ротация, поиск.
Как модуль логирования ускоряет отладку?
Модуль реализует PSR-3 — это промышленный стандарт логирования. Вы получаете единый интерфейс для всех компонентов системы. Время поиска конкретной ошибки сокращается в 10 раз по сравнению с плоским файлом. Алерты в Telegram/Slack при критических ошибках позволяют реагировать мгновенно.
Архитектура
Модуль vendor.logger реализует интерфейс PSR-3 (Psr\Log\LoggerInterface), что позволяет подключать его к любым библиотекам, поддерживающим PSR-3: Guzzle, Doctrine, Symfony.
Таблицы ORM:
-
b_vendor_log_entry— записи лога: id, level (debug/info/notice/warning/error/critical/alert/emergency), channel, message, context (JSON), extra (JSON), created_at, user_id, request_uri, ip -
b_vendor_log_channel— каналы: id, code, name, min_level, handlers (JSON), is_active -
b_vendor_log_archive— архивированные записи (после ротации): аналогичная структура + archived_at
Реализация PSR-3
class BitrixLogger extends \Psr\Log\AbstractLogger { private string $channel; public function __construct(string $channel = 'app') { $this->channel = $channel; } public function log($level, $message, array $context = []): void { if (!$this->isLevelEnabled($level)) { return; } $extra = [ 'user_id' => $GLOBALS['USER']?->GetID(), 'request_uri' => $_SERVER['REQUEST_URI'] ?? '', 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', ]; LogEntryTable::add([ 'LEVEL' => $level, 'CHANNEL' => $this->channel, 'MESSAGE' => $this->interpolate($message, $context), 'CONTEXT' => $context, 'EXTRA' => $extra, ]); } private function interpolate(string $message, array $context): string { $replace = []; foreach ($context as $key => $val) { $replace['{' . $key . '}'] = is_scalar($val) ? $val : json_encode($val, JSON_UNESCAPED_UNICODE); } return strtr($message, $replace); } } Использование в коде
$logger = new \Vendor\Logger\BitrixLogger('payment'); $logger->info('Инициирован платёж', ['order_id' => 42, 'sum' => 1500.00, 'gateway' => 'sberbank']); $logger->error('Ошибка платёжного шлюза', ['order_id' => 42, 'response' => $gatewayResponse]); // Глобальный логгер через фасад \Vendor\Logger\Log::channel('sync')->warning('Синхронизация с 1С: товар не найден', ['xml_id' => 'ABC-123']); Обработчики (Handlers)
Запись в БД — не единственный обработчик. Модуль поддерживает несколько хэндлеров на один канал:
- DatabaseHandler — запись в
b_vendor_log_entry(основной) - FileHandler — запись в файл с автоматической ротацией (ежедневно, максимум N файлов)
- SlackHandler — отправка critical/emergency в Slack-канал через Webhook
- TelegramHandler — отправка алертов в Telegram-бот при уровне >= error
Конфигурация каналов хранится в b_vendor_log_channel в поле handlers (JSON). Пример:
{ "handlers": [ {"type": "database", "min_level": "debug"}, {"type": "telegram", "min_level": "error", "chat_id": "-100123456789"} ] } | Обработчик | Назначение | Минимальный уровень |
|---|---|---|
| DatabaseHandler | Долгосрочное хранение | debug |
| FileHandler | Быстрый доступ к свежим логам | debug |
| SlackHandler | Алерты критических ошибок | critical |
| TelegramHandler | Мгновенные уведомления | error |
Ротация и архивация
Агент ротации запускается раз в сутки:
// Записям старше 30 дней — перенос в b_vendor_log_archive // Записям старше 90 дней в архиве — удаление // Параметры настраиваются в административном интерфейсе модуля \Vendor\Logger\RotationAgent::run(); Перенос выполняется батчами по 1000 записей, чтобы не блокировать таблицу на долгое время.
Перехват ошибок PHP
Модуль может регистрировать глобальный обработчик ошибок PHP:
set_error_handler(function($errno, $errstr, $errfile, $errline) { $level = ErrorLevelMapper::toLogLevel($errno); \Vendor\Logger\Log::channel('php')->log($level, $errstr, [ 'file' => $errfile, 'line' => $errline, 'errno' => $errno, ]); return false; // Стандартный обработчик Битрикс тоже срабатывает }); set_exception_handler(function(\Throwable $e) { \Vendor\Logger\Log::channel('php')->critical($e->getMessage(), [ 'exception' => get_class($e), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString(), ]); }); Административный интерфейс
Поиск по логам — основной инструмент при отладке:
- Фильтрация по уровню, каналу, дате, IP, пользователю, тексту сообщения
- Поиск по контексту (JSON-поле через PostgreSQL
@>или LIKE по serialized) - Детальный просмотр записи: полный контекст, стек вызовов, заголовки запроса
- Статистика: топ ошибок за период, динамика по уровням, разбивка по каналам
- Управление конфигурацией каналов и обработчиков
Что входит в разработку модуля?
- Проектирование структуры таблиц ORM под ваши задачи
- Реализация PSR-3-совместимого логгера
- Настройка обработчиков (БД, файл, Slack, Telegram)
- Разработка агента ротации и архивации
- Подключение глобального перехвата ошибок PHP
- Создание административного интерфейса с поиском и статистикой
- Интеграция с существующим кодом (замена вызовов
AddMessage2Log) - Документация по эксплуатации и инструкция для разработчиков
- Тестирование на тестовом полигоне перед выкаткой на продакшн
Мы гарантируем работу модуля на стабильной кодовой базе без сюрпризов. Опираясь на 10-летний опыт разработки на Битрикс, мы создаём решения, которые работают предсказуемо. Подробнее о PSR-3.
Типичные ошибки при внедрении
- Забывают настроить ротацию — архивные таблицы могут расти бесконтрольно
- Устанавливают слишком высокий минимальный уровень для каналов (например, только error) — теряют отладочную информацию
- Не интегрируют алерты в Telegram/Slack — узнают об ошибках только от клиентов
- Используют один канал для всех событий — теряют контекст
Сроки разработки
| Этап | Срок |
|---|---|
| ORM-таблицы, PSR-3 реализация | 1 день |
| DatabaseHandler, FileHandler | 1 день |
| Slack и Telegram алерты | 1 день |
| Ротация и архивация (агент) | 1 день |
| Перехват ошибок PHP | 1 день |
| Административный интерфейс, поиск | 2 дня |
| Тестирование | 1 день |
Итого: от 8 рабочих дней. Закажите модуль логирования под ключ — и забудьте о ручном парсинге логов. Свяжитесь с нами для оценки вашего проекта.







