Логирование ошибок битрикс

Просмотров: 12618
Дата последнего изменения: 04.08.2023

Сложность урока:

3 уровень — средняя сложность. Необходимо внимание и немного подумать.

4

5

Недоступно в лицензиях:

Ограничений нет

  Введение

В ядро добавлены логгеры, реализующие интерфейс PSR-3:

  • базовый абстрактный класс \Bitrix\Main\Diag\Logger, реализующий интерфейс PSR-3;
  • файловый логгер \Bitrix\Main\Diag\FileLogger;
  • syslog логгер \Bitrix\Main\Diag\SysLogger.

Логгеры пользуются форматтером логов \Bitrix\Main\Diag\LogFormatter, который делает замены плейсхолдеров в соответствии с PSR-3.

Примечание: Библиотека доступна с версии main 21.900.0.

  Logger Interface

Интерфейс \Psr\Log\LoggerInterface довольно прост, это — набор функций логирования, поддерживающих уровни логирования. Уровни задаются константами \Psr\Log\LogLevel::*.

interface LoggerInterface
{
    public function emergency($message, array $context = array());
    public function alert($message, array $context = array());
    public function critical($message, array $context = array());
    public function error($message, array $context = array());
    public function warning($message, array $context = array());
    public function notice($message, array $context = array());
    public function info($message, array $context = array());
    public function debug($message, array $context = array());
    public function log($level, $message, array $context = array());
}

В сообщении могут быть {плейсхолдеры}, которые заменяются данными из ассоциативного массива $context.

Также полезным может быть интерфейс \Psr\Log\LoggerAwareInterface, если вы хотите сообщить, что ваш объект готов принять логгер PSR-3:

interface LoggerAwareInterface
{
    public function setLogger(LoggerInterface $logger);
}

  Логгеры в продукте

Логгеры в продукте расширены по сравнению с PSR-3. Можно:

  • установить минимальный уровень логирования, ниже которого логгер ничего не выведет,
  • установить форматтер.

Файловый логгер \Bitrix\Main\Diag\FileLogger умеет записывать сообщения в файл, указанный в конструкторе. Если размер лога превышает указанный максимальный, производится однократная ротация файла. Ноль означает не делать ротацию. По умолчанию размер 1 Мб.

$logger = new Diag\FileLogger($logFile, $maxLogSize);
$logger->setLevel(\Psr\Log\LogLevel::ERROR);
// выведет в лог
$logger->error($message, $context);
// НЕ выведет в лог
$logger->debug($message, $context);

Syslog логгер \Bitrix\Main\Diag\SysLogger является надстройкой над функцией php syslog. Конструктор принимает параметры, использующиеся функцией openlog.

$logger = new Diag\SysLogger('Bitrix WAF', LOG_ODELAY, $facility);
$logger->warning($message);

На файловый логгер переведена функция AddMessage2Log и класс \Bitrix\Main\Diag\FileExceptionHandlerLog, а также логирование в модуле Проактивная защита (security).

С версии 23.500.0 логгер для AddMessage2Log можно указать в настройках .settings.php.

  Форматирование сообщения

В логгер можно установить форматтер сообщения. По умолчанию используется форматтер \Bitrix\Main\Diag\LogFormatter, реализующий интерфейс \Bitrix\Main\Diag\LogFormatterInterface:

interface LogFormatterInterface
{
	public function format($message, array $context = []): string;
}

Конструктор форматтера принимает параметры $showArguments = false, $argMaxChars = 30 (показывать значение аргументов в трейсе, максимальная длина аргумента).

$logger = new Main\Diag\FileLogger(LOG_FILENAME, 0);
$formatter = new Main\Diag\LogFormatter($showArgs);
$logger->setFormatter($formatter);

Основная задача форматтера — подставлять значения в плейсхолдеры сообщения из массива контекста. Форматтер умеет обрабатывать определенные плейсхолдеры:

  • {date} — текущее время * ;
  • {host} — HTTP host * ;
  • {exception} — объект исключения (\Throwable);
  • {trace} — массив бектрейса;
  • {delimiter} — разделитель сообщений * .

* — не обязательно передавать в массиве контекста, подставляется автоматически.

$logger->debug(
    "{date} - {host}\n{trace}{delimiter}\n", 
    [
        'trace' => Diag\Helper::getBackTrace(6, DEBUG_BACKTRACE_IGNORE_ARGS, 3)
    ]
);

Значения из массива контекста форматтер старается привести к удобному виду в зависимости от типа значения. Принимаются строки, массивы, объекты.

Использование

В простом виде объект может принять логгер снаружи, поддерживая интерфейс \Psr\Log\LoggerAwareInterface. Можно использовать соответствующий трейт:

use Bitrix\Main\Diag;
use Psr\Log;

class MyClass implements Log\LoggerAwareInterface
{
	use Log\LoggerAwareTrait;
	
	public function doSomething()
	{
	    if ($this->logger)
	    {
	        $this->logger->error('Error!');
	    }
	}
}

$object = new MyClass();
$logger = new Diag\FileLogger("/var/log/php/error.log");
$object->setLogger($logger);
$object->doSomething();

Однако, не удобно менять код на работающем проекте, чтобы передать логгер в нужный объект. Для этого в классе логгера предусмотрена своя фабрика. На вход фабрике передается строка-идентификатор логгера:

use Bitrix\Main\Diag;
use Psr\Log;

class MyClass implements Log\LoggerAwareInterface
{
	use Log\LoggerAwareTrait;
	
	public function doSomething()
	{
	    if ($logger = $this->getLogger())
	    {
	        $logger->error('Error!');
	    }
	}

	protected function getLogger()
	{
		if ($this->logger === null)
		{
			$logger = Diag\Logger::create('myClassLogger', [$this]);
			$this->setLogger($logger);
		}

		return $this->logger;
	}
}

Настройка

В корневой секции файла .settings.php логгеры указываются в ключе loggers. Синтаксис описания совпадает с настройками ServiceLocator. Отличие состоит в том, что сервис-локатор является реестром, а здесь настраивается фабрика.

В замыкание-конструктор constructor можно передать дополнительные параметры через второй параметр фабрики Diag\Logger::create('logger.id', [$this]). Параметры позволяют гибко включать логирование в зависимости от переданных параметров, в том числе вызывать методы самого объекта.

Дополнительно можно указать минимальный уровень журналирования (level) и собственный форматтер (formatter). Форматтер ищется в сервис локаторе по его идентификатору.

// /bitrix/.settings.php
return [
	//...
	'services' => [
		'value' => [
			//...
			'formatter.Arguments' => [
				'className' => '\Bitrix\Main\Diag\LogFormatter',
				'constructorParams' => [true],
			],
		],
		'readonly' => true,
	]
	'loggers' => [
		'value' => [
			//...
			'main.HttpClient' => [
//				'className' => '\\Bitrix\\Main\\Diag\\FileLogger',
//				'constructorParams' => ['/home/bitrix/www/log.txt'],
//				'constructorParams' => function () { return ['/home/bitrix/www/log.txt']; },
				'constructor' => function (\Bitrix\Main\Web\HttpClient $http, $method, $url) { 
					$http->setDebugLevel(\Bitrix\Main\Web\HttpDebug::ALL);
					return new \Bitrix\Main\Diag\FileLogger('/home/bitrix/www/log.txt');
				},
				'level' => \Psr\Log\LogLevel::DEBUG,
				'formatter' => 'formatter.Arguments',
			],
		],
		'readonly' => true,
	],
	//...
];

При указании замыкания-конструктора constructor желательно использовать файл .settings_extra.php, чтобы не потерять код при сохранении настроек из API.

Существует \Psr\Log\NullLogger, его можно установить, если не хочется писать if($logger) перед каждым вызовом логгера. Однако, следует учитывать, стоит ли делать дополнительную работу по формированию сообщения и контекста.

  Классы

Список классов, поддерживающих фабрику логгеров:

Класс Id логгера Передаваемые параметры
\Bitrix\Main\Web\HttpClient main.HttpClient [$this, $this->queryMethod, $this->effectiveUrl]

Объяснять, что такое логи — нет необходимости. Когда есть логи, то проще разобраться с возникшими проблемами и выяснить, почему они начались. Основные моменты в использовании логов.

Логи не должны занимать всё свободное пространство на диске, т.е. в логи нужно помещать только нужную информацию, а не всё подряд. Устаревшие логи должны удаляться. Для удаления устаревших логов лучше всего настроить задание на 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 Bitrix\Main\Diag\Debug;
Debug::dumpToFile($_SERVER); // для случаев, когда нужен var_dump
Debug::writeToFile($_SERVER); // когда нужен print_r

Также в ядре D7 появились методы, для измерения времени. В старом ядре аналогов не было.

use Bitrix\Main\Diag\Debug;
Debug::startTimeLabel("foo");
foo();
Debug::endTimeLabel("foo");

Debug::startTimeLabel("bar");
bar();
Debug::endTimeLabel("bar");

print_r(Debug::getTimeLabels());

Таким образом, правильная расстановка функций логирования и временных меток позволит выявить уязвимости в коде и уменьшить время выдачи сайта от сервера пользователю.

Если битрикс свежий и в папке /bitrix/ есть файл .settings.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' => true,
      'assertion_throws_exception' => false,
      'assertion_error_type' => 256,
      'log' => array (
        'settings' => array (
          'file' => 'bitrix/modules/error.log',
          'log_size' => 1000000,
        ),
	  ),
    ),
    'readonly' => true,
  ),

Два года назад писали про внутренней инструмент для логирования. С помощью модуля Intensa Logger мы выполняем отладку на проектах на 1С-Битрикс.

Ниже расскажем про релиз-версию, в которой:

  • повысили уровень качества, стабильности и безопасности кода,
  • упростили установку,
  • улучшили производительность и отказоустойчивость,
  • добавили в проект тесты,
  • добавили трекер SQL-запросов,
  • добавили новые возможности для кастомизации в рамках проекта.

Результат выложили в 1С-Битрикс: Маркетплейс, пользуйтесь.

Сегодня поделимся обновленной документацией, расскажем о фичах в новой версии и на примерах разберем, как использовать Intensa Logger в проектах.

Учимся логировать с модулем

Intensa Logger — простой функциональный модуль CMS Bitrix, который логирует данные проекта в файлы. Подойдет для отслеживания «‎узких»‎ мест в проекте и дебага при разработке.

В модуле реализованы:

  • оповещения о критических проблемах в проекте,
  • очищение устаревших лог-файлов,
  • таймеры выполнения,
  • SQL-трекер на основе diag.

Как добавить модуль в проект

Самый простой способ — установить его через маркетплейс.

Но можно и вручную. Для этого:

  1. Клонируем репозиторий в директорию с модулями /bitrix/modules/ или /local/modules/.
  2. Переходим в директорию intensa.logger/lib (команда cd intensa.logger/lib).
  3. Устанавливаем зависимости composer install --no-dev.
  4. Добавляем модуль через админскую часть сайта /bitrix/admin/partner_modules.php.

При установке модуль создает:

  • защищённую директорию /logs/ в корне проекта для хранения лог-файлов,
  • почтовое события для оповещений фатальных уровней логирования,
  • агента для удаления устаревших лог-файлов.

Как работать с хранилищем логов

По умолчанию лог-файлы хранятся в директории /logs/ в корне проекта. Изменить место хранения можно в настройках модуля. Защита логов от просмотра в браузере реализована через .htaccess.

В проектах, которые используют nginx в качестве веб-сервера, нужно самостоятельно обезопасить хранилище. Для этого закрываем директорию от просмотра в браузере в конфигах nginx или меняем пути хранилища логов — выносим хранилище из document_root.

Чтобы файлы логов было легко найти, модуль содержит функционал хранения по дням.

Например, все логи за 19 августа 2021 года можно найти в директории /logs/2021-08-19/. Название лог-файла совпадает с кодом логгера, который передается в конструктор класса ILog.

Уровни логирования

Уровень лога — это классификация проблемы. В модуле они подразделяются так:

  • DEBUG,
  • INFO,
  • NOTICE,
  • WARNING,
  • ERROR,
  • CRITICAL,
  • ALERT,
  • EMERGENCY.

Для каждого уровня лога действует одноименный метод, но с особенностями.

  • log() — является алиасом для info().
  • fatal() — является алиасом для alert().

Это наследие, с которым приходится жить 🙂

Уровни CRITICAL, ALERT, EMERGENCY, помимо записи данных в лог-файл, отправляют сообщение администратору сайта. Адрес электронной почты можно указать в настройках модуля.

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

Из чего состоят логи

Разбираем пример по частям.

Как использовать возможности модуля — на примерах

  1. Пример инициализации логгера и демонстрация базовых методов.
// Подключение модуля
 \Bitrix\Main\Loader::includeModule('intensa.logger');

 // Инициализация объекта логгера
 // В конструктор передаем код логгера, которому будет соответствовать имя лог-файла
 $logger = new \Intensa\Logger\ILog('logger_code');

 // Пример записи логов уровня INFO
 // Вторым параметром можно передать данные любого типа
 $context = ['яблоко', 'мандарин', 'банан'];

 $logger->info('сообщение', $context);

 // Пример записи логов уровня ERROR
 $logger->error('что-то пошло не так', $context);

 // Пример записи логов уровня ALERT
 // В данном случае будет отправлено письмо с информацией из лога
 $logger->alert('алярм! мы все сломали', $context);

Содержимое лог-файла:

[2021-11-24 01:24:30][:info][pid:2696] сообщение Array
 (
     [0] => яблоко
     [1] => мандарин
     [2] => банан
 )
 [2021-11-24 01:24:30][:error][pid:2696] что-то пошло не так Array
 (
     [0] => яблоко
     [1] => мандарин
     [2] => банан
 )
 [2021-11-24 01:24:30][:alert][pid:2696] алярм! мы все сломали Array
 (
     [0] => яблоко
     [1] => мандарин
     [2] => банан
 )
  1. Пример вызова таймера.
// Подключение модуля
 \Bitrix\Main\Loader::includeModule('intensa.logger');

 // Инициализация объекта логгера
 // В конструктор передаем код логгера, ему будет соответствовать имя лог-файла
 $logger = new \Intensa\Logger\ILog('logger_timer');

 $context = ['яблоко', 'мандарин', 'банан'];
 $logger->info('Логируем какие-то данные', $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');

Содержимое лог файла:

[2021-11-24 01:29:47][:info][pid:2704] Логируем какие-то данные Array
 (
     [0] => яблоко
     [1] => мандарин
     [2] => банан
 )
 [2021-11-24 01:29:48][:info][pid:2704] Timer timer_1 Array
 (
     [CODE] => timer_1
     [START_TIME] => 2021-11-24 01:29:47.000000
     [STOP_TIME] => 2021-11-24 01:29:48.000000
     [EXEC_TIME] => 1.000375032
 )
 [2021-11-24 01:29:50][:info][pid:2704] Timer timer_internal Array
 (
     [CODE] => timer_internal
     [START_TIME] => 2021-11-24 01:29:48.000000
     [STOP_TIME] => 2021-11-24 01:29:50.000000
     [EXEC_TIME] => 2.000512838
 )
 [2021-11-24 01:29:53][:info][pid:2704] Timer timer_2 Array
 (
     [CODE] => timer_2
     [START_TIME] => 2021-11-24 01:29:48.000000
     [STOP_TIME] => 2021-11-24 01:29:53.000000
     [EXEC_TIME] => 5.000887871
 )
 [2021-11-24 01:29:53][:info][pid:2704] Timer dont_stop Array
 (
     [CODE] => dont_stop
     [START_TIME] => 2021-11-24 01:29:53.000000
     [STOP_TIME] => 2021-11-24 01:29:53.000000
     [EXEC_TIME] => 0.010784864
     [STOP_POINT] => __destruct
 )

Формат логов таймера:

  • CODE — код таймера, определяется разработчиком при вызове таймера.
  • START_TIME — время запуска.
  • STOP_TIME — время остановки.
  • EXEC_POINT — время исполнения, т. е. разница между временем остановки и временем запуска.
  • START_POINT — место определения точки запуска, вызов метода startTimer().
  • STOP_POINT — место определения точки остановки, вызов метода через команду stopTimer().
  • Значение «__destruct» означает, что для текущего счетчика не вызвали метод stopTimer() и остановка произошла в деструкторе класса.
  1. Использование трекера SQL-запросов.
\Bitrix\Main\Loader::includeModule('intensa.logger');

 $logger = new \Intensa\Logger\ILog('logger_sql');
 // Запускаем трекер-sql запросов
 $logger->startSqlTracker('get_users');
 // Пример кода, который делает запрос к базе данных
 $users = [];
 $result = \Bitrix\Main\UserTable::getList([
     'select' => ['ID','SHORT_NAME'],
     'order' => ['LAST_LOGIN'=>'DESC'],
     'limit' => 3
 ]);
 // Остановка трекера
 $logger->stopSqlTracker('get_users');

Содержимое лог-файла:

[2021-11-24 01:29:48][:info][pid:1138] SqlTracker get_users: Array
 (
     [0] => Array
         (
             [query] => 
                             SELECT main_user.ID AS ID,
                             CONCAT(main_user.LAST_NAME, ' ', UPPER(SUBSTR(main_user.NAME, 1, 1)), '.') AS SHORT_NAME
                             FROM b_user main_user
                             ORDER BY main_user.LAST_LOGIN DESC
                             LIMIT 0, 3
             [time] => 0.0076520442962646
         )
 )

Методы логгера

Доступные методы класса ILog помогут кастомизировать поведение каждого отдельного объекта логгера.

\Bitrix\Main\Loader::includeModule('intensa.logger');

 $logger = new \Intensa\Logger\ILog('logger_sql');

 // Метод заставляет логгер перезаписывать файл при каждом новом вызове логирующего метода
 $logger->rewrite();

 // Через этот метод можно установить дополнительный email для получения алерт-сообщений на почту
 $logger->setAlertEmail('additional_admin@no-reply.com');
 $logger->setAlertEmail('additional_admin2@no-reply.com');

 // Позволяет отключить отладку для конкретного логгера
 // Данная настройка уберет из лог-файла информацию о месте вызова логгера
 // Рекомендуется использовать данную настройку для логгеров, записывающих большое кол-во данных при одном вызове
 // Снижает количество оперативной памяти, выделяемой php
 $logger->notUseBacktrace();

 // Включает отладку для конкретного логгера
 // Используется в случае, когда глобально в настройках модуля выключена настройка отладки
 $logger->useBacktrace();

Что нового в модуле

Конфигурация модуля

Полностью отказались от хранения настроек в файле конфигурации и перенесли все настройки в админ-панель Битрикс.

Внедрили ряд новых настроек и информирований. Теперь можно:

  • менять права доступа к файлам и директориям логов,
  • записывать логи в формате json,
  • управлять ротацией логов,
  • получать информацию о безопасности логов (логи недоступны в браузере),
  • получать информацию о существовании корневой директории и делать в ней записи.

Отказоустойчивость и улучшение производительности

В альфа-версии модуля PHP не хватало памяти. Это отразилось на проектах с малыми серверными ресурсами: когда нужно было записать большое количество данных в файл, скрипт падал с фатальной ошибкой.

Чтобы выяснить причину, мы подключили профилирование. По результатам стало ясно, какие именно узлы модуля нужно рефакторить.

Переписали функционал записи логов в файл и протестировали его на серверах с 1 Гб оперативной памяти. Тестовые скрипты для записи большого количества данных больше не падали. Производительность увеличилась примерно на 50 %, если сравнивать с альфа-версией.

Удаление устаревших логов

Еще одна проблема, с которой столкнулись, — это громадный объем устаревших данных логирования. Ценности они не несли, а место на сервере занимали. Поэтому мы реализовали на агенте функционал, который очищает устаревшие файлы и директории. В настройках модуля можно указать, как часто нужно удалять устаревшие логи.

Ссылки на модуль

  1. Маркетплейс 1С-Битрикс http://marketplace.1c-bitrix.ru/solutions/intensa.logger/
  2. Репозиторий https://github.com/intensa/intensa.logger

Статью подготовили:

Intensa — производственное агентство для e‑commerce.

Мы помогаем торговым сетям увеличивать выручку интернет-магазинов за счет быстрой и отлаженной аутсорс-разработки.

Начать проект

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

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

Фильтр

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

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

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

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

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

  • Группировка включена — журнал будет содержать поля: Класс ошибки, Файл, Строка, Текст, Количество;
  • Группировка выключена — журнал будет содержать поля: ID, Хит, Класс ошибки, Файл, Строка, Текст.
Настроить Переход к диалогу настройки внешнего вида отчетной формы.
Excel Экспорт данных из отображаемой таблицы в MS Excel.

Ошибки PHP

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

© «Битрикс», 2001-2023, «1С-Битрикс», 2023

Наверх

Сложность урока:

1 уровень — интуитивно все понятно из интерфейса, но почитать стоит.


1 из 5

Дата изменения:
23.02.2023

Просмотров:
22321

Недоступно в лицензиях:

Текущую редакцию Вашего 1С-Битрикс можно просмотреть на странице Обновление платформы (Marketplace > Обновление платформы).


Ограничений нет

  Настройки

На странице Монитор производительности: настройки PHP (Настройки > Производительность > PHP) отображается сводная таблица Параметры окружения с анализом параметров PHP.

Монитор производительности: настройки PHP

С помощью ссылки Настройки PHP можно перейти на страницу с подробной информацией о PHP (phpinfo).

  Ошибки

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

Монитор производительности: сервер БД

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

Журнал ошибок PHP ошибок хранится в базе. Удалить журнал ошибок PHP можно с помощью опции

Удалить собранные ранее данные

Доступна только при отключенном мониторе

в настройках модуля Монитор производительности.

1. Создаю в корне сайта файл error.php со следующим содержимым:

<?php
echo show_me_error;
?>

2. Открываю в браузере site.ru/error.php — белый экран

3. Смотрю bitrix/php_interface/dbconn.php:
$DBDebug = true;

4. Смотрю bitrix/php_interface/.settings.php:

...
  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' => true,
      'assertion_throws_exception' => false,
      'assertion_error_type' => 256,
      'log' => array (
        'settings' => array (
        'file' => 'bitrix/modules/error.log',
        'log_size' => 1000000,
        ),
      ),  
    ),
    'readonly' => false,
  ),
...

5. Смотрю bitrix/modules/error.log — кучу левых Warning, однако моей ошибки в моём error.php нет
6. Иду в .htaccess:

php_value display_errors 1
php_value error_reporting 7

7. Иду на сервере в /var/log/nginx/error.log — то же самое, ничего о моей ошибке

Как мне на экране при открытии error.php увидеть мою ошибку?

Основное предназначение модуля — быстрое оповещение о случивших на сайте проблемах. Для этого существуют сервисы (агенты), следящие за ошибками (чтение изменений в логах, прямой отлов ошибок в PHP), и сервисы, отправляющие оповещения на e-mail, либо в браузер доверенному лицу.

Для экономии места и удобства работы записываются только уникальные ошибки. У них обновляются дата последнего возникновения и количество повторов.

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

Сохраняемые данные

Внешний вид ленты логов Битрикс Ахтунг 500 Про

Поле
Дата первого возникновения Микросекунды с 1.1.1970
Т.к. пишутся только уникальные ошибки, чтобы понять очередность их возниковения, время пишется в микросекундах
Дата последнего возникновения Микросекунды с 1.1.1970.
Число повторов Сколько раз наблюдалась ошибка.
Тип (уровень) Warning, notice etc.
Ошибка (сообщение) Содержимое ошибки, сама запись.
Трейс При наличии.
Игнорировать Отправлять ли оповещения о данной ошибке или нет.

Поиск по логам

Поиск можно делать по полям: дата последнего возникновения, тип ошибки, текст ошибки, источник (по данным из какого файла искать).

Поиск по логам в модуле для Битрикс Ахтунг 500 Про

Если заполнены все поля, запрос поиска можно представить так:

SELECT * FROM `logs`
WHERE
`last_date` >= $lastDate
AND `type` IN ("@type1","@type2")
AND (`message` LIKE "%$text%" OR `trace` LIKE "%$text%")
AND `file_id` IN (@fileId1, @fileId2)

При включенном автообновлении значения из фильтра влияют на оповещение о новых события, если у вас в фильтре указано отображать только фатальные ошибки, то в живой ленте будут только фатальные ошибки, другие ошибки вы не увидите, даже если они происходят.
Это удобно использовать при отладке кода, например, всегда ли есть значения массивов по ключам. Включает фильтр на NOTICE, и гоняем свой скрипт, ожидая новые оповещения о NOTICE.

Подключение обработчика ошибок PHP

Используется стандартный механизм Битрикс. Логгер будет вызван функциями set_error_handler,
set_exception_handler, register_shutdown_function

Чтобы подключить логгер нужно прописать настройки в файле bitrix/.settings.php в секции exception_handling

'exception_handling' => array(
        'value' => array(
            'debug' => false,
            'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING & ~E_DEPRECATED,
            'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING & ~E_DEPRECATED,
            'ignore_silence' => false,
            'assertion_throws_exception' => true,
            'assertion_error_type' => 256,
            'log' => array(
                'class_name' => 'BxSolAchtungProExceptionsHandlerLogger',
                'required_file' => 'modules/bxsol.achtungpro/lib/ExceptionsHandler/Logger.php',
                //либо
                'required_file' => 'modules/bxsol.achtungpro/lib/ExceptionsHandler/LoggerOld.php',
            ),
        ),
        'readonly' => false
    ),

Битрикс меняли формат ExceptionsHandler, поэтому реализовано 2 варианта логгера, точные настройки есть на странице настройки модуля. Читать подробнее об обработке ошибок в Битрикс.

Чтение файлов логов

В настройках модуля нужно просто указать абсолютный путь к файлу. Поддерживаемые типы: PHP Error log, TimeWeb error log, Apache error log.

Форматы лог файлов

Php error log

[29-May-2016 22:32:39 Europe/Moscow] PHP Fatal error: error message

Apache Error log

[29-May-2016 22:32:39 Europe/Moscow] [php fatal error] error message

Time Web Error Log

[Mon May 02 07:23:29 2016] [error] [client **.***.**.**] Error_Type Error_Message

Ведется работа над чтением логов любого формата.

Скрипт считывает только новые данные, с того места, где остановился в прошлый раз. Но если файл был очищен, и в него добавились новые записи, все они будут учтены.

Агенты

Крайне рекомендуем поставить в cron запуск агентов анализа файлов и отправки оповещений. Если у вас сейчас агенты выполняются на клиентах, это снизит нагрузку и добавит стабильности.
А если агенты уже выполняются на кроне, то защитит от неисправности агентов других модулей.

Агент анализа файлов:

[АБСОЛЮТНЫЙ_ПУТЬ_НА_СЕРВЕРЕ]/bitrix/modules/bxsol.achtungpro/cron/FilesListener.php

Агент отправки писем:

[АБСОЛЮТНЫЙ_ПУТЬ_НА_СЕРВЕРЕ]/bitrix/modules/bxsol.achtungpro/cron/EmailSender.php

В данных файлах требуется указать значение переменной $_SERVER['DOCUMENT_ROOT']

Логгер для разработчиков

Вместе с модулем поставляется логгер, который можно легко использовать для своих нужд. Например, отправлять оповещения, что выгрузка в Яндекс.Маркет прошла успешна, либо наоборот.

При этом вы получите уведомление на почту или сразу в браузер, если в данный момент находитесь сайте. Держите процессы на сайте под полным контролем!

use BxSolAchtungProLogger;

CModule::IncludeModule('bxsol.achtungpro');
Logger::info('Yandex market uploading done');

Если нет желания запускать полную инициализацию модуля, достаточно подключить файл логгера.

use BxSolAchtungProLogger;

require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/bxsol.achtungpro/lib/Logger.php';
Logger::info('Yandex market uploading done');

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

Общий синтаксис

class Logger
{
 ...
    /**
     * @param string $message - сообщение
     * @param string $type - уровень (notice, warning)
     * @param bool $withTrace - записывать трейс или нет. Причем вызов логгера будет удалён из трейса.
     */
    public static function log($message, $type, $withTrace = true)
 ...
}

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

Функции краткого вызова

Вызов Тип Трейс
Logger::crit($message) CRIT Всегда
Logger::debug($message, $withTrace = true) DEBUG По умолчанию есть
Logger::deprecated($message, $withTrace = true) DEPRECATED По умолчанию есть
Logger::fatal($message) FATAL Всегда
Logger::info($message, $withTrace = false) INFO По умолчанию нет
Logger::notice($message, $withTrace = true) NOTICE По умолчанию есть
Logger::strict($message, $withTrace = true) STRICT По умолчанию есть
Logger::warning($message, $withTrace = true) WARNING По умолчанию есть
Альтернативные события
Вызов Тип Трейс
Logger::miracle($message, $withTrace = true) MIRACLE По умолчанию есть
Logger::shit($message, $withTrace = true) SHIT_HAPPENS По умолчанию есть
Logger::vovaPomogi($message) VOVA_POMOGI Всегда

Полный список возможных типов (уровней) ошибок

Ошибки с кратким вызовом (Logger::info() и т.д.):

  • Logger::CRIT
  • Logger::DEBUG
  • Logger::DEPRECATED
  • Logger::FATAL
  • Logger::INFO
  • Logger::NOTICE
  • Logger::INFO
  • Logger::MIRACLE
  • Logger::SHIT_HAPPENS
  • Logger::VOVA_POMOGI

Остальные типы:

  • Logger::ALL
  • Logger::COMPILE_ERROR
  • Logger::COMPILE_WARNING
  • Logger::CORE_ERROR
  • Logger::CORE_WARNING
  • Logger::DB_ERROR
  • Logger::ERROR
  • Logger::PARSE
  • Logger::RECOVERABLE_ERROR
  • Logger::UNCATCHABLE_EXCEPTION
  • Logger::USER_DEPRECATED
  • Logger::USER_ERROR
  • Logger::USER_NOTICE
  • Logger::USER_WARNING

Объяснять, что такое логи — нет необходимости. Когда есть логи, то проще разобраться с возникшими проблемами и выяснить, почему они начались. Основные моменты в использовании логов.

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

Возврат к списку

Блог «Дивасофт»

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/.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,   ),

?>

Формат ужасный, но другого нет 🙂

Kwork.ru - услуги фрилансеров от 500 руб.

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Логарифмическая ошибка это
  • Лифт уэл ошибка е4 причины
  • Логистика ошибка манхва
  • Логирование ошибок windows 10
  • Лишнее слово как называется ошибка

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии