На странице Журнал ошибок PHP (Настройки > Производительность > Ошибки PHP (N)) можно просмотреть журнал регистрации ошибок PHP, где N — общее количество ошибок.
Примечание: Данная страница отображается, только если в настройках модуля Монитор производительности указана опция Вести журнал предупреждений PHP.
Фильтр
Форма фильтра используется для фильтрации записей журнала в соответствии с указанными условиями. Нижеследующая таблица описывает параметры, по которым могут выбираться записи.
Поле | Описание |
---|---|
Найти | Позволяет найти записи об ошибках по их основным параметрам. Это поле присутствует, даже если фильтр свернут. |
Хит | Позволяет найти записи по идентификатору хита. |
Класс ошибки | Позволяет осуществлять поиск в журнале по классу (типу) ошибок. |
Файл | Позволяет осуществлять поиск в журнале по файлу, в котором произошла ошибка. |
Текст | Позволяет осуществлять поиск в журнале по тексту ошибки. |
Чтобы отфильтровать ошибки по заданным критериям поиска, нажмите кнопку Найти. Для отображения всех ошибок нажмите кнопку Отменить.
Контекстная панель
Кнопка | Описание |
---|---|
Группировка | Позволяет задать способ группировки записей об ошибках в журнале:
|
Настроить | Переход к диалогу настройки внешнего вида отчетной формы. |
Excel | Экспорт данных из отображаемой таблицы в MS Excel. |
Ошибки PHP
Поле | Описание |
---|---|
ID | Идентификатор записи об ошибке в журнале. |
Хит | Идентификатор хита. |
Класс ошибки | Класс (тип) ошибки. |
Файл | Путь к файлу в системе, в котором произошла ошибка. |
Строка | Номер строки в файле. |
Текст | Текст ошибки. |
© «Битрикс», 2001-2023, «1С-Битрикс», 2023
Наверх
Какие именно ошибки вы хотите отслеживать?
Дебаг в файл:
Существует возможность записывать в отдельный отладочный файл все запросы к базе данных и время их выполнения, для этого необходимо инициализировать переменную $DBDebugToFile, значением «true» в файле /bitrix/php_interface/dbconn.php.
В новом ядре за это отвечают функции: BitrixMainDiagDebug::dumpToFile и BitrixMainDiagDebug::writeToFile.
Ручное добавление через addMessage2Log:
// В файле /bitrix/php_interface/dbconn.php определить константу LOG_FILENAME, в которой задать путь к лог-файлу
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");
В дальнейшем любые массивы, тексты можно отправлять в этот файл посредством
AddMessage2Log("Произвольный текст сообщения или массив", "my_module_id(необязательно)");
Объяснять, что такое логи — нет необходимости. Когда есть логи, то проще разобраться с возникшими проблемами и выяснить, почему они начались. Основные моменты в использовании логов.
Логи не должны занимать всё свободное пространство на диске, т.е. в логи нужно помещать только нужную информацию, а не всё подряд. Устаревшие логи должны удаляться. Для удаления устаревших логов лучше всего настроить задание на cron.
Логи должны быть удобными для изучения — логи с ошибками и логи с диагностическими данными должны помещаться в разные файлы. Желательно разделять логи на временные интервалы — например, ежедневные логи (наиболее распространенный вариант, или, например, по месяцам, или неделям).
Все логи нужно держать в одной папке, чтобы было удобней их изучать (/logs/, /_logs/, /local/logs/ и т.п. ). В целях защиты следует закрыть доступ к папке с логами по http — настраивается в .htacces,
deny from all
и/или добавить к названию файла уникальный идентификатор.
Папку для логов надо предварительно создать и убедиться, что битрикс (веб-сервер) имеет права на запись в нее.
В системе 1С-Битрикс существует 2 вида логов:
ADDMESSAGE2LOG(…)
Это функция из старого ядра. Многие модули пишут через нее отладочную информацию.
Пример настройки места хранения логов, выводимых данной функцией, выглядит так (папка logs/bx должна быть создана):
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"] . "/logs/bx/" . date("Y-m-d") . ".log");
Прописать данную настройку можно, например, в dbconn.php.
СЕКЦИЯ EXCEPTION_HANDLING В ФАЙЛЕ .SETTINGS.PHP
Это уже функционал нового ядра D7.
Битрикс через данный функционал пишет информацию обо всех ошибках и исключениях. Что именно пишется — зависит от настроек.
Пример настройки логов с разделением по дате:
'exception_handling' => array ( 'value' => array ( 'debug' => false, // disables error output to screen // ошибки для вывода в лог 'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING, 'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_COMPILE_WARNING, 'ignore_silence' => true, 'assertion_throws_exception' => true, 'assertion_error_type' => 256, 'log' => array ( 'settings' => array ( 'file' => "logs/bx_error/" . date("Y-m-d") . ".log", 'log_size' => 1000000, // ~ 1Mb per file ), ), ), 'readonly' => true, ),
ФУНКЦИИ ОТЛАДКИ В ЯДРЕ D7
На замену функции AddMessage2Log в ядре D7 пришли новые функции:
use BitrixMainDiagDebug; Debug::dumpToFile($_SERVER); // для случаев, когда нужен var_dump Debug::writeToFile($_SERVER); // когда нужен print_r
Также в ядре D7 появились методы, для измерения времени. В старом ядре аналогов не было.
use BitrixMainDiagDebug; Debug::startTimeLabel("foo"); foo(); Debug::endTimeLabel("foo"); Debug::startTimeLabel("bar"); bar(); Debug::endTimeLabel("bar"); print_r(Debug::getTimeLabels());
Таким образом, правильная расстановка функций логирования и временных меток позволит выявить уязвимости в коде и уменьшить время выдачи сайта от сервера пользователю.
Нужно включить показ ошибок bitrix/www/bitrix/.settings.php
‘debug’ => true,
тоже самое с базой данных .
bitrix/www/bitrix/php_interface/dbconn.php
Также можно заменить ‘log’ => null на
'log' =>
array (
'settings' =>
array (
'file' => '/var/log/php/exceptions.log',
'log_size' => 1000000,
),
),
Часто для отладки сервера (или если после неудачных настроек у вас сервер вообще перестал работать) нужно смотреть логи, в которые записываются все события и, самое важное, ошибки. С целью выявления этих ошибок и нужно смотреть за логами хотя бы раз в месяц или после возникновения внештатной ситуации. В них будет указано в какое время и что произошло.
Чтобы вы долго не искали где и что находится, привожу список путей на сервере ко всем нужным файлам.
Лог Apache
/var/log/httpd/error_log
Лог Nginx
/var/log/nginx/error.log
Лог PHP
/var/log/php/exceptions.log
Лог почты
Путь к логам почты прописан в /home/bitrix/.msmtprc. По-умолчанию после настройки почты для первого сайта логи пишутся сюда:
/home/bitrix/msmtp_default.log
bash, cron
/var/spool/mail/root
/var/spool/mail/bitrix
Лог запущенных задач в BitrixVM
/opt/webdir/temp
- Главная
- Блог
- Поиск
- Контакты
Отладка и поиск ошибок сайтов сделанных на Битриксе
05.10.2017
В системе управления Bitrix, для отладки и поиска ошибок, есть специализированный раздел «Журнал событий».
В этом логе можно найти не мало интересного: https://SITE.ru/bitrix/admin/event_log.php?lang=ru
Пометки: Bitrix, отладка, лог.
Проверяем логи, битрикс окружение
bitrix, nginx, apache, php, mysql, sendmail, cron
В процессе жизнедеятельности сайт и сервер оставляют после себя различные записи в лог-файлах. Данные из этих файлов желательно периодически разгребать и анализировать, что бы сайт работал быстро и бесперебойно
Для битрикс окружения на centos пути к логам обычно будут такими (зависит от настроек):
- Битрикс: __bx_log.log или log.txt в корне сайта. Зависит от переменной LOG_FILENAME в файле /bitrix/php_interface/dbconn.php
- Apache: /var/log/httpd/error_log
- Nginx: /var/log/nginx/error.log
- PHP: /var/log/php/exceptions.log
- Почта: /home/bitrix/msmtp_default.log
- bash, cron: /var/spool/mail/root и /var/spool/mail/bitrix
- bitrixvm: /opt/webdir/temp (логи запущенных задач)
Как часто надо проверять? Раз в неделю стоит поглядывать, я думаю. Просто что бы убедиться, что эти файлы пусты и ошибок не было.
И как бонус стоит проверить файл /var/log/btmp командой last -f /var/log/btmp если там очень много попыток авторизации, значит доступ к ssh пытаются «брутфорсить». Стоит изменить порт доступа к ssh (в файле /etc/ssh/sshd_config поменять строку «Port 22» на другое значение, разрешить доступ к новому порту в iptables и перезагрузить sshd) Что бы сбросить лог авторизации нужно выполнить команду cat /dev/null > /var/log/btmp
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.
Опубликовано 21 апреля 2017 | Обновлено 24 июля 2020
Возврат к списку
Пользователь 732237 Постоянный посетитель Сообщений: 297 |
это сообщение стабильно раз в день вылазит, потом пропадает |
Пользователь 3282811 Постоянный посетитель Сообщений: 106 |
Вообще неплохо было бы глянуть скрин, но могу предположить, что там что-то вроде — «ошибка, включите *что-то* в .settings» |
Пользователь 14571 Эксперт Сообщений: 787 |
У вас на хостинге наверняка настроен лог ошибок в php. Можно его посмотреть. |
Пользователь 90886 Эксперт Сообщений: 2453 |
Похоже, что это всплывающее уведомление по результатам автопроверки сайта. Когда вылезет такое уведомление — запустите проверку сайта, если будут ошибки — там же можно открыть и лог. |
Пользователь 732237 Постоянный посетитель Сообщений: 297 |
Вот эта строка каждый день вылазит, потом, после проверки пропадает, на следующий день снова вылазит. https://yadi.sk/i/NxaCitDHpM5A5A ) |
Пользователь 90886 Эксперт Сообщений: 2453 |
#6 0 17.07.2020 13:07:44
Картинку не видно. Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем |
||
Пользователь 732237 Постоянный посетитель Сообщений: 297 |
#7 0 17.07.2020 13:15:58
Сделал просто ссылку на Яндекс Диск |
||
Пользователь 90886 Эксперт Сообщений: 2453 |
#8 0 17.07.2020 13:17:05
Да, я про эту ошибку и имел в виду. Там есть ссылка «Проверить и исправить» — при проверке показываются какие-то ошибки? Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем |
||||
Пользователь 3282811 Постоянный посетитель Сообщений: 106 |
#9 0 17.07.2020 13:17:31
Нажмете «Проверить и исправить» — дальше все поймете) |
||||
Пользователь 90886 Эксперт Сообщений: 2453 |
#10 0 17.07.2020 13:18:56
Да, но иногда бывает так, что ошибок-то и нет Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем |
||
Пользователь 732237 Постоянный посетитель Сообщений: 297 |
#11 0 20.07.2020 13:21:35
У меня ошибок нет, просто зелёная полоска каждый день, после того как проверю сайт на ошибки пару раз и обновлю страницу — полоска пропадает. |
||
Пользователь 90886 Эксперт Сообщений: 2453 |
#12 0 20.07.2020 13:35:20 Теперь все ясно. Лог в папке /bitrix/ — файл вида site_checker_b4795dcec7806b8339781b7702ae8928.log, если несколько — смотрите последний по дате. Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем |
Думаю, объяснять, что такое логи — нет необходимости. Имея под рукой логи проще разобраться с возникшими проблемами и выяснить, когда и почему они начались. В данной статье расскажу основные моменты в использовании логов.
Для начала обсудим важный, но не для всех явный момент — логи полезны только в том случае, если с ними удобно работать.
Поэтому логи не должны занять все свободное пространство на диске, т.е. в логи нужно помещать только нужную информацию, а не все подряд. Устаревшие логи должны удаляться. Для удаления устаревших логов лучше всего настроить задание на cron.
Логи должны быть удобными для изучения — логи с ошибками и логи с диагностическими данными должны помещаться в разные файлы. Желательно разделять логи на временные интервалы — например, ежедневные логи (наиболее распространенный вариант, но если уверены, что логов будет мало — можно выделять, например, по месяцам, или неделям).
Все логи нужно держать в одной папке, чтобы было удобней их изучать (/logs/, /_logs/, /local/logs/ и т.п. ). В целях защиты следует закрыть доступ к папке с логами по http — настраивается в .htacces,
deny from all
и/или добавить к названию файла уникальный для проекта постфикс.
Папку для логов надо предварительно создать и убедиться, что битрикс (веб-сервер) имеет права на запись в нее.
В системе 1С-Битрикс существует 2 вида логов
AddMessage2Log(…)
Это функция из старого ядра.
Многие модули пишут через нее отладочную информацию.
Пример настройки места хранения логов, выводимых данной функцией, выглядит так (не забывайте, что папка logs/bx должна быть создана):
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"] . "/logs/bx/" . date("Y-m-d") . ".log");
Прописать данную настройку можно, например, в dbconn.php.
Секция exception_handling в файле .settings.php
Это уже функционал нового ядра.
Ядро через данный функционал пишет информацию обо всех ошибках и исключениях. Что именно пишется — зависит от настроек.
Пример настройки логов с разделением по дате:
'exception_handling' => array ( 'value' => array ( 'debug' => false, // disables error output to screen // ошибки для вывода в лог 'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING, 'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_COMPILE_WARNING, 'ignore_silence' => true, 'assertion_throws_exception' => true, 'assertion_error_type' => 256, 'log' => array ( 'settings' => array ( 'file' => "logs/bx_error/" . date("Y-m-d") . ".log", 'log_size' => 1000000, // ~ 1Mb per file ), ), ), 'readonly' => true, ),
Функции отладки в ядре D7
На замену функции AddMessage2Log в ядре D7 пришли новые функции:
use BitrixMainDiagDebug; Debug::dumpToFile($_SERVER); // для случаев, когда нужен var_dump Debug::writeToFile($_SERVER); // когда нужен print_r
Также в ядре D7 появились методы, для измерения времени. В старом ядре аналогов не было.
use BitrixMainDiagDebug; Debug::startTimeLabel("foo"); foo(); Debug::endTimeLabel("foo"); Debug::startTimeLabel("bar"); bar(); Debug::endTimeLabel("bar"); print_r(Debug::getTimeLabels());
Таким образом, корректная расстановка функций логирования и временных меток позволит обнаружить уязвимости в коде и
уменьшить время отдачи сайта от сервера пользователю.
Объяснять, что такое логи — нет необходимости. Когда есть логи, то проще разобраться с возникшими проблемами и выяснить, почему они начались. Основные моменты в использовании логов.
Логи не должны занимать всё свободное пространство на диске, т.е. в логи нужно помещать только нужную информацию, а не всё подряд. Устаревшие логи должны удаляться. Для удаления устаревших логов лучше всего настроить задание на cron.
Логи должны быть удобными для изучения — логи с ошибками и логи с диагностическими данными должны помещаться в разные файлы. Желательно разделять логи на временные интервалы — например, ежедневные логи (наиболее распространенный вариант, или, например, по месяцам, или неделям).
Все логи нужно держать в одной папке, чтобы было удобней их изучать (/logs/, /_logs/, /local/logs/ и т.п. ). В целях защиты следует закрыть доступ к папке с логами по http — настраивается в .htacces,
deny from all
и/или добавить к названию файла уникальный идентификатор.
Папку для логов надо предварительно создать и убедиться, что битрикс (веб-сервер) имеет права на запись в нее.
В системе 1С-Битрикс существует 2 вида логов:
ADDMESSAGE2LOG(…)
Это функция из старого ядра. Многие модули пишут через нее отладочную информацию.
Пример настройки места хранения логов, выводимых данной функцией, выглядит так (папка logs/bx должна быть создана):
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"] . "/logs/bx/" . date("Y-m-d") . ".log");
Прописать данную настройку можно, например, в dbconn.php.
СЕКЦИЯ EXCEPTION_HANDLING В ФАЙЛЕ .SETTINGS.PHP
Это уже функционал нового ядра D7.
Битрикс через данный функционал пишет информацию обо всех ошибках и исключениях. Что именно пишется — зависит от настроек.
Пример настройки логов с разделением по дате:
'exception_handling' => array ( 'value' => array ( 'debug' => false, // disables error output to screen // ошибки для вывода в лог 'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING, 'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_COMPILE_WARNING, 'ignore_silence' => true, 'assertion_throws_exception' => true, 'assertion_error_type' => 256, 'log' => array ( 'settings' => array ( 'file' => "logs/bx_error/" . date("Y-m-d") . ".log", 'log_size' => 1000000, // ~ 1Mb per file ), ), ), 'readonly' => true, ),
ФУНКЦИИ ОТЛАДКИ В ЯДРЕ D7
На замену функции AddMessage2Log в ядре D7 пришли новые функции:
use BitrixMainDiagDebug; Debug::dumpToFile($_SERVER); // для случаев, когда нужен var_dump Debug::writeToFile($_SERVER); // когда нужен print_r
Также в ядре D7 появились методы, для измерения времени. В старом ядре аналогов не было.
use BitrixMainDiagDebug; Debug::startTimeLabel("foo"); foo(); Debug::endTimeLabel("foo"); Debug::startTimeLabel("bar"); bar(); Debug::endTimeLabel("bar"); print_r(Debug::getTimeLabels());
Таким образом, правильная расстановка функций логирования и временных меток позволит выявить уязвимости в коде и уменьшить время выдачи сайта от сервера пользователю.
Ежемесячно наши программисты завершают десятки задач по разработке и поддержке интернет-магазинов. С ростом команды и проектов мы разработали удобный инструмент для логирования в виде модуля для системы 1С-Битрикс, на которой разработано большинство наших проектов.
Основная задача модуля — быстро находить баги и оповещать нас о них раньше, чем клиент или пользователи сайта, а также следить за качеством после релиза.
Что такое логирование?
Логирование — это запись данных о работе программы или сервера в какое-либо хранилище (файл, база данных и т. д.) с целью дальнейшего анализа и выявления потенциальных проблем.
Зачем логировать?
Допустим, у вас есть функционал, который работает с API другого сервиса. Код стабильно выполняет свою работу. Однако, если вам упадет тикет с сообщением об ошибке, вы вряд ли вспомните, что вы отправляли в API, какой запрос получили, и не поймете, когда именно произошла ошибка. В таких ситуациях логирование помогает получить всю необходимую информацию о природе бага и быстро отладить работу кода.
Что логировать?
Логировать можно что угодно. Logger – это не панацея от всех проблем, а инструмент, помогающий в нелегкой войне с багами.
Мы используем модуль логирования в dev- и production-окружении:
- Для дебаггинга при разработке.
- При выкладке нового функционала. Обязательно добавляем временные логи, чтобы проследить, все ли работает должным образом.
- Постоянные логи в критичных местах проекта.
- Для замера времени выполнения кода.
Наш модуль Intensa.Logger (версия alfa)
Корневая директория для логов задается разработчиком. Ввиду безопасности ее можно вынести из DOCUMENT_ROOT проекта.
Классы модуля:
- IntensaLogger/ILog – класс, реализующий в себе основной функционал модуля.
- IntensaLoggerI/LogAlert – класс, реализующий функционал для оповещения разработчиков посредством почтовых событий.
- IntensaLogger/Settings – класс, который отвечает за настройки модуля.
Структура хранения логов:
- Все логи хранятся в основной директории (DIR_LOG определяется в файле конфига)
/logs/
- Для каждого дня создается своя директория
/logs/2018-10-01/
- Критические проблемы, зафиксированные уровнем error и fatal, попадают в отдельную директорию errors
/logs/2018-10-01/errors/
- Имя файла лога определяется символьным кодом (задается в конструкторе объекта логгера) и расширением файла (LOG_FILE_EXTENSION определяется в файле конфига)
/logs/2018-10-01/catalog_info.log
- Если не указать код логгера, то данные будут записаны в общий файл
/logs/2018-10-01/common.log
Уровни логирования, их особенности и способы применения
Функционал имеет 5 уровней логирования:
- debug
- info
- warning
- error
- fatal
При вызове error и fatal данные будут записываться в отдельную папку {LOG_DIR}/errors/. Также на почту разработчика будет отправлено письмо с цепочкой логов. Использовать данный уровень следует только в критических местах проекта для выявления проблем, которые могут повлиять на работоспособность системы.
Какой уровень лога использовать для того или иного места в программе, решает сам разработчик, так как он (уровень) определяет критичность проблемы, возникшей при выполнении кода. Ниже приведем несколько примеров использования уровней логирования.
Пример использования
<?
// подключение модуля
if (CModule::IncludeModule('intensa.logger')) {
/*
* Создание объекта логгера.
* Конструктору передаем код логгера
* Файл лога будет соответствовать коду логгера + расширение, заданное в файле конфига
*/
$logger = new IntensaLoggerILog('log_code');
}
/*
* Ниже представлены несколько методов для более гибкой работы с данными логов
* Методы переопределяют значения, заданные в файле конфига в рамках вызова логгера
* */
/*
* При вызове данного метода вся цепочка логов будет отправляться на почту
* Независимо от того, был ли вызван метод fatal()
* */
$logger->sendAlert();
/*
* При вызове данного метода в запись лога будет добавлена информация о файле, в котором был вызван метод
* Данные будут записываться даже при установленном флаге USE_BACKTRACE = false в файле конфига
* */
$logger->useBacktrace();
/*
* При вызове данного метода вызовы лога будут отделены разделителями
* Разделители будут устанавливаться даже при установленном флаге USE_DELIMITER = false в файле конфига
* */
$logger->useLogDelimiter();
/*
* Для каждого уровня логирования имеется свой метод
* */
$logger->debug('debug message', [0 => 'context']);
$logger->info('log message', [0 => 'context']);
$logger->log('log message', [0 => 'context']); // алиас для log()
$logger->error('error message', [0 => 'context']);
/*
* При вызове метода будет автоматически отправлено письмо c полной цепочкой логов в рамках вызова
* */
$logger->fatal('fatal message', [0 => 'context']);
?>
Использование логгера при создании заявки
<?
$ticketData = ['name' => 'John', 'sname' => 'Smith', 'phone' => '8000'];
if (CModule::IncludeModule('intensa.logger')) {
$logger = new IntensaLoggerILog(__FILE__);
}
$logger->log('ticket data', $ticketData);
try {
$ticket = new TestTicket($ticketData);
$newTicketID = $ticket->add();
$logger->log('ticket create number ' . $newTicketID);
} catch (Exception $e) {
$logger->fatal('ticket create problem', $e);
}
<?
$ticketData = ['name' => 'John', 'sname' => 'Smith', 'phone' => '8000'];
if (CModule::IncludeModule('intensa.logger')) {
$logger = new IntensaLoggerILog(__FILE__);
}
$logger->log('ticket data', $ticketData);
try {
$ticket = new TestTicket($ticketData);
$newTicketID = $ticket->add();
$logger->log('ticket create number ' . $newTicketID);
} catch (Exception $e) {
$logger->fatal('ticket create problem', $e);
}
?>
<?
$ticketData = ['name' => 'John', 'sname' => 'Smith', 'phone' => '8000'];
if (CModule::IncludeModule('intensa.logger')) {
$logger = new IntensaLoggerILog(__FILE__);
}
$logger->log('ticket data', $ticketData);
try {
$ticket = new TestTicket($ticketData);
$newTicketID = $ticket->add();
$logger->log('ticket create number ' . $newTicketID);
} catch (Exception $e) {
$logger->fatal('ticket create problem', $e);
}
?>
Использование логгера при добавлении товара
<?
if (CModule::IncludeModule('intensa.logger')) {
$logger = new IntensaLoggerILog('import_script');
}
$logger->useLogDelimiter();
$logger->log('start import');
if (file_exists('import.xml')) {
$logger->log('file exist');
// ..
// code
// ..
$uid = $arImportFile['GUID'];
$logger->log('start add product');
if (in_array($uid, $arProducts)) {
$logger->error('product exist. not add product', $uid);
} else {
// add product
$logger->log('success.product add', $uid);
}
} else {
$logger->error('file not exist');
}
?>
Использование таймера вызова
Допустим, нужно иметь в логе информацию о времени выполнения какого-то определенного участка кода:
<?
$context = [1, 2, 3];
if (CModule::IncludeModule('intensa.logger')) {
$logger = new IntensaLoggerILog('my_logger_code');
}
$logger->log('Логируем какие-то данные', $context);
// запуск таймера. необходимо передать код таймера
$logger->startTimer('timer_1');
sleep(1);
// остановка таймера. необходимо передать код таймера.
$logger->stopTimer('timer_1');
$logger->startTimer('timer_2');
// можно запускать один таймер внутри другого
$logger->startTimer('timer_internal');
sleep(2);
$logger->stopTimer('timer_internal');
sleep(3);
$logger->stopTimer('timer_2');
// если у таймера не указана точка остановки, то время остановки определяется в дeструкторе класса
$logger->startTimer('dont_stop');
?>
Формат логов таймера:
- CODE – код таймера, задается разработчиком при вызове таймера
- START_TIME – время запуска
- STOP_TIME – время остановки
- EXEC_POINT – время исполнения (разница между временем остановки и временем запуска)
- START_POINT – место определения точки запуска (вызов метода startTimer())
- STOPPOINT – место определения точки остановки (вызов метода stopTimer()). Значение «_destruct» означает, что не был вызван метод stopTimer() для текущего счетчика и остановка произошла в деструкторе класса
Еще одна небольшая особенность: ключи STARTPOINT и STOPPOINT будут добавлены в файл при включенной опции USE_BACKTRACE в конфиге или если вызван метод useBacktrace().
Содержимое файла лога будет выглядеть следующим образом:
==============================[START: 9538]==============================
[2018-10-08 16:15:47] [:info] [/var/www/html/test/ish.php:11] Логируем какие-то данные Array
(
[0] => 1
[1] => 2
[2] => 3
)
[2018-10-08 16:15:48] [:timer] [/var/www/html/test/ish.php:17] Lead time: Array
(
[CODE] => timer_1
[START_TIME] => 2018-10-08 16:15:47.000000
[STOP_TIME] => 2018-10-08 16:15:48.000000
[EXEC_TIME] => 1.000124931
[START_POINT] => /var/www/html/test/ish.php:14
[STOP_POINT] => /var/www/html/test/ish.php:17
)
[2018-10-08 16:15:50] [:timer] [/var/www/html/test/ish.php:24] Lead time: Array
(
[CODE] => timer_internal
[START_TIME] => 2018-10-08 16:15:48.000000
[STOP_TIME] => 2018-10-08 16:15:50.000000
[EXEC_TIME] => 2.000115871
[START_POINT] => /var/www/html/test/ish.php:22
[STOP_POINT] => /var/www/html/test/ish.php:24
)
[2018-10-08 16:15:53] [:timer] [/var/www/html/test/ish.php:27] Lead time: Array
(
[CODE] => timer_2
[START_TIME] => 2018-10-08 16:15:48.000000
[STOP_TIME] => 2018-10-08 16:15:53.000000
[EXEC_TIME] => 5.000380039
[START_POINT] => /var/www/html/test/ish.php:19
[STOP_POINT] => /var/www/html/test/ish.php:27
)
[2018-10-08 16:15:53] [:timer] [/var/www/dev/intensa.logger/classes/general/ILog.php:516] Lead time: Array
(
[CODE] => dont_stop
[START_TIME] => 2018-10-08 16:15:53.000000
[STOP_TIME] => 2018-10-08 16:15:53.000000
[EXEC_TIME] => 0.009480000
[START_POINT] => /var/www/html/test/ish.php:30
[STOP_POINT] => __destruct
)
==============================[END: 9538]==============================
На скрине ниже описан шаблон записи лога.
На данный момент запись лога может занимать более одной строки. Т.к. логи будут анализироваться вручную, а смотреть многомерные массивы строкой не очень удобно.
Новые фичи или как будет выглядеть beta-версия
Модуль Logger работает 2 года и значительно облегчает нашу работу. За это время было найдено несколько узких мест и продуманы полезные фичи. Уже этой весной планируем реализовать несколько новых возможностей и выложить модуль в Bitrix Marketplace.
Ниже список наиболее интересных исправлений и фич для следующего обновления:
- Ускоренная запись в файлы.
- Максимальная отказоустойчивость.
- Просмотр логов через админку «Битрикса».
- Хранение настроек модуля в базе и редактирование через админ-панель Bitrix (интерфейс просмотра и настройки).
- Построение отчета вызова логгера в формате отчет-таблицы о вызовах во всем проекте (поможет избавиться от ненужных логов, например, отладочных).
- Автоматическая очистка старых логгеров – можно будет настроить очистку логов по времени, например старше 2 недель (настраиваемый параметр).
- Оповещение о фатальных проблемах посредством telegram-бота.
Использование модуля ежемесячно экономит отделу разработки десятки часов. При выкладке нового функционала мы получаем тикет об ошибке, определяем точное место сбоя и устраняем его.
Модуль размещен на GitHub.
Статью подготовили:
Intensa — производственное агентство для e‑commerce.
Мы помогаем торговым сетям увеличивать выручку интернет-магазинов за счет быстрой и отлаженной аутсорс-разработки.
Какие задачи мы решаем
Блог «Дивасофт»
23 января 2017, Михаил
В файле bitrix/.settings.php
<?php
'exception_handling' =>
array (
'value' =>
array (
'debug' => true,
'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
'ignore_silence' => false,
'assertion_throws_exception' => true,
'assertion_error_type' => 256,
'log' =>
array (
'settings' =>
array (
'file' => 'bitrix/err.log',
'log_size' => 1000000,
),
),
),
'readonly' => false,
)
?>
Логи будут в файле bitrix/err.log