Bitrix как посмотреть ошибки

На странице Журнал ошибок PHP (Настройки > Производительность > Ошибки PHP (N)) можно просмотреть журнал регистрации ошибок PHP, где N — общее количество ошибок.

Примечание: Данная страница отображается, только если в настройках модуля Монитор производительности указана опция Вести журнал предупреждений PHP.

Фильтр

Форма фильтра используется для фильтрации записей журнала в соответствии с указанными условиями. Нижеследующая таблица описывает параметры, по которым могут выбираться записи.

Поле Описание
Найти Позволяет найти записи об ошибках по их основным параметрам. Это поле присутствует, даже если фильтр свернут.
Хит Позволяет найти записи по идентификатору хита.
Класс ошибки Позволяет осуществлять поиск в журнале по классу (типу) ошибок.
Файл Позволяет осуществлять поиск в журнале по файлу, в котором произошла ошибка.
Текст Позволяет осуществлять поиск в журнале по тексту ошибки.

Чтобы отфильтровать ошибки по заданным критериям поиска, нажмите кнопку Найти. Для отображения всех ошибок нажмите кнопку Отменить.

Контекстная панель

Кнопка Описание
Группировка Позволяет задать способ группировки записей об ошибках в журнале:

  • Группировка включена — журнал будет содержать поля: Класс ошибки, Файл, Строка, Текст, Количество;
  • Группировка выключена — журнал будет содержать поля: ID, Хит, Класс ошибки, Файл, Строка, Текст.
Настроить Переход к диалогу настройки внешнего вида отчетной формы.
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

pic1


Пометки: Bitrix, отладка, лог.

Яндекс.Метрика

Проверяем логи, битрикс окружение

bitrix, nginx, apache, php, mysql, sendmail, cron

В процессе жизнедеятельности сайт и сервер оставляют после себя различные записи в лог-файлах. Данные из этих файлов желательно периодически разгребать и анализировать, что бы сайт работал быстро и бесперебойно

Для битрикс окружения на centos пути к логам обычно будут такими (зависит от настроек):

  1. Битрикс: __bx_log.log или log.txt в корне сайта. Зависит от переменной LOG_FILENAME в файле /bitrix/php_interface/dbconn.php
  2. Apache: /var/log/httpd/error_log
  3. Nginx: /var/log/nginx/error.log
  4. PHP: /var/log/php/exceptions.log
  5. Почта: /home/bitrix/msmtp_default.log
  6. bash, cron: /var/spool/mail/root и /var/spool/mail/bitrix
  7. 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
Баллов: 24
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 18.10.2016

это сообщение стабильно раз в день вылазит, потом пропадает

 

Пользователь 3282811

Постоянный посетитель

Сообщений: 106
Баллов: 10
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

Вообще неплохо было бы глянуть скрин, но могу предположить, что там что-то вроде — «ошибка, включите *что-то* в .settings»
Где-то в папке /bitrix/ найдите файлик .settings.php и поищите в нем выражение «debug» => «false» — замените false на true и получите то, что нужно, наверно )

 

Пользователь 14571

Эксперт

Сообщений: 787
Баллов: 104
Авторитет:

1

Рейтинг пользователя:

7

Регистрация: 10.08.2007

У вас на хостинге наверняка настроен лог ошибок в php. Можно его посмотреть.  

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

Похоже, что это всплывающее уведомление по результатам автопроверки сайта. Когда вылезет такое уведомление — запустите проверку сайта, если будут ошибки — там же можно открыть и лог.

 

Пользователь 732237

Постоянный посетитель

Сообщений: 297
Баллов: 24
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 18.10.2016

Вот эта строка каждый день вылазит, потом, после проверки пропадает, на следующий день снова вылазит.
 (Скрин

https://yadi.sk/i/NxaCitDHpM5A5A

)

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

#6

0

17.07.2020 13:07:44

Цитата
Trionikl SR написал:
Вот эта строка каждый день вылазит, потом, после проверки пропадает, на следующий день снова вылазит.

Картинку не видно.

Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем

 

Пользователь 732237

Постоянный посетитель

Сообщений: 297
Баллов: 24
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 18.10.2016

#7

0

17.07.2020 13:15:58

Цитата
Денис Сон написал:
Картинку не видно.

Сделал просто ссылку на Яндекс Диск

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

#8

0

17.07.2020 13:17:05

Цитата
Trionikl SR написал:

Цитата
Денис Сон  написал:
Картинку не видно.

Сделал просто ссылку на Яндекс Диск

Да, я про эту ошибку и имел в виду. Там есть ссылка «Проверить и исправить» — при проверке показываются какие-то ошибки?

Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем

 

Пользователь 3282811

Постоянный посетитель

Сообщений: 106
Баллов: 10
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

#9

0

17.07.2020 13:17:31

Цитата
Trionikl SR написал:

Цитата
Денис Сон  написал:
Картинку не видно.

Сделал просто ссылку на Яндекс Диск

Нажмете «Проверить и исправить» — дальше все поймете)

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

#10

0

17.07.2020 13:18:56

Цитата
Дима Парфенов написал:
Нажмете «Проверить и исправить» — дальше все поймете)

Да, но иногда бывает так, что ошибок-то и нет :)

Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем

 

Пользователь 732237

Постоянный посетитель

Сообщений: 297
Баллов: 24
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 18.10.2016

#11

0

20.07.2020 13:21:35

Цитата
Денис Сон написал:
Да, но иногда бывает так, что ошибок-то и нет

У меня ошибок нет, просто зелёная полоска каждый день, после того как проверю сайт на ошибки пару раз и обновлю страницу — полоска пропадает.

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

#12

0

20.07.2020 13:35:20

Теперь все ясно. Лог в папке /bitrix/ — файл вида site_checker_b4795dcec7806b8339781b7702ae8928.log, если несколько — смотрите последний по дате.
Агент раз в сутки запускает проверку основных параметров.
Причина, скорее всего, в том, что агенты настроены на крон, а конфиг PHP при запуске из крона не соответствует рекомендациям Битрикса. Подробнее — в логе, там видно будет в чем проблема и куда копать.

Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем

Думаю, объяснять, что такое логи — нет необходимости. Имея под рукой логи проще разобраться с возникшими проблемами и выяснить, когда и почему они начались. В данной статье расскажу основные моменты в использовании логов.

Для начала обсудим важный, но не для всех явный момент — логи полезны только в том случае, если с ними удобно работать. 

Поэтому логи не должны занять все свободное пространство на диске, т.е. в логи нужно помещать только нужную информацию, а не все подряд. Устаревшие логи должны удаляться. Для удаления устаревших логов лучше всего настроить задание на 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

Понравилась статья? Поделить с друзьями:
  • Bitrix выдает 500 ошибку
  • Bitrix вывод ошибок mysql
  • Bitrix вывод 404 ошибки
  • Bitrix вывести сообщение о ошибке
  • Bitrix вывести ошибки