Bitrix лог ошибок mysql

<?php

use BitrixMainDiagExceptionHandlerFormatter;

use BitrixMainDiagExceptionHandlerLog;

/**

* @see BitrixMainApplication::createExceptionHandlerLog

*/

class ErrorLogging extends ExceptionHandlerLog

{

    private string $table_name = ‘error_log_’;

    private $level;

    private BitrixMainDiagFileExceptionHandlerLog $file_logger;

    private BitrixMainDBMysqliConnection|BitrixMainDBConnection $connection;

    private array $dont_show;

    /**

     * @param Throwable $exception

     * @param int $logType

     */

    public function write($exception, $logType)

    {

        if (in_array($logType, $this->dont_show)) {

            return;

        }

        $log_type = $this::logTypeToString($logType);

        $text = ExceptionHandlerFormatter::format($exception, false, $this->level);

        try {

            $this->connection->add($this->getTableName(),

[‘message’ => $exception->getMessage(), ‘stack_trace’ => $text, ‘error_level’ => $log_type, ‘context’ => json_encode([‘uri’ => $_SERVER[‘REQUEST_URI’]])]);

        } catch (BitrixMainDBSqlException $e) {

            $this->file_logger->write($exception, $logType);

            $this->file_logger->write($e, $logType);

        }

    }

    public function initialize(array $options)

    {

        try {

            $this->connection = BitrixMainApplication::getConnection(‘log_db’);

            $t = $this->getTableName();

            $exist = $this->connection->isTableExists($t);

            if (!$exist) {

                $this->createTable();

            }

            $this->level = $options[‘level’] ?? 0;

            $this->dont_show = $options[‘dont_show’] ?? [];

        } finally {

            $this->file_logger = new BitrixMainDiagFileExceptionHandlerLog();

            $this->file_logger->initialize($options);

        }

    }

    public function getTableName(): string

    {

        return ($this->table_name . date(‘Y_m_01’));

    }

    protected function createTable()

    {

        $table_name = $this->getTableName();

        $sql = «CREATE TABLE `{$table_name}` (

`id` INT(10) NOT NULL AUTO_INCREMENT,

`error_level` VARCHAR(255) NOT NULL DEFAULT » COLLATE ‘utf8mb4_unicode_ci’,

`message` TEXT NOT NULL COLLATE ‘utf8mb4_unicode_ci’,

`stack_trace` TEXT NULL DEFAULT NULL COLLATE ‘utf8mb4_unicode_ci’,

`context` TEXT NULL DEFAULT NULL COLLATE ‘utf8mb4_unicode_ci’,

PRIMARY KEY (`id`) USING BTREE

)

COLLATE=’utf8mb4_unicode_ci’

ENGINE=InnoDB

;

        $this->connection->queryExecute($sql);

    }

}

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

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.

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

Какие задачи мы решаем

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

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

Лог 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

Какие именно ошибки вы хотите отслеживать?
Дебаг в файл:

Существует возможность записывать в отдельный отладочный файл все запросы к базе данных и время их выполнения, для этого необходимо инициализировать переменную $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());

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

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

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

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

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

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