Рассмотрим один из способов отладки кода с помощью метода xPDO::log(). Этот метод используется в MODX для записи информации в журнал ошибок (error log). Давайте рассмотрим его поближе.

public function log($level, $msg, $target= '', $def= '', $file= '', $line= '')

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

  • MODX_LOG_LEVEL_FATAL / modX::LOG_LEVEL_FATAL = 0
  • MODX_LOG_LEVEL_ERROR / modX::LOG_LEVEL_ERROR = 1
  • MODX_LOG_LEVEL_WARN / modX::LOG_LEVEL_WARN = 2
  • MODX_LOG_LEVEL_INFO / modX::LOG_LEVEL_INFO = 3
  • MODX_LOG_LEVEL_DEBUG / modX::LOG_LEVEL_DEBUG = 4

Второй параметр содержит информацию, которая будет записана в журнал ошибок.

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

Системные настройки

Есть 2 системные настройки, влияющие на работу метода log() — log_target и log_level. По-умолчанию они имеют значение FILE и 1 соответственно.

Первая указывает куда выводить информацию. Возможные значения:

  • FILE — сообщение сохраняется в файл core/cache/logs/error.log.
  • ECHO — информация выводится на экран.
  • HTML — информация выводится на экран обёрнутая в тег <pre>.

Наcтройка log_level указывает текущий уровень логирования MODX. Доступные значения:

  • 0 — для фатальных сообщений (fatal).
  • 1 — для ошибок (error).
  • 2 — для предупреждений (warn).
  • 3 — для информационных сообщений (info).
  • 4 — для отладочных сообщений (debug).

Эта настройка ограничивает логирование сообщений указанным уровнем. Т.е. метод log() с уровнем выше, чем в настройке, будет отклонён. Например, если в настройке указано log_level=1 (т.е. логируются только ошибки), то все вызовы метода log() с уровнем WARN, INFO и DEBUG в журнал записаны не будут.

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

$modx->log(MODX_LOG_LEVEL_ERROR, 'Сообщение');
// или так
$modx->log(modX::LOG_LEVEL_ERROR, 'Сообщение');
// или ещё короче
$modx->log(1, 'Сообщение');

Но в режиме разработки полезно работать с уровнем DEBUG (log_level=4) и логировать с типом дебага.

$modx->log(MODX_LOG_LEVEL_DEBUG, 'Сообщение');

Это полезно ещё тем, что даже если вы забудете потом удалить этот вызов, то он не будет забивать журнал ошибок, так как на продакшн сайте уровень логирования всегда выставляется в 1 (записывать в журнал только ошибки).

Для отладки на фронте удобнее выводить отладочную информацию прямо на странице, чем переключаться в админку и открывать там журнал ошибок. Сделать это можно указав в третьем параметре метода log() значение «HTML» или «ECHO».

//Выводим на сайте массив
$modx->log(1, print_r($array, 1),'HTML');

Ещё один не обязательный, но полезный параметр — $def. В нём можно передать название скрипта или метода класса, в котором вызван метод log(). Особенно это удобно, когда таких вызовов несколько.

//Если в 3-ем параметре ничего не указать, то будет использован target из системной настройки log_target. 
$modx->log(1, 'Сообщение', '', ' MySnippet');
// Отладка в методе класса
$modx->log(1, 'Сообщение', '', __METHOD__);

Вывод будет выглядеть так

[2016-10-17 20:08:10] (ERROR in mySnippet @ www\core\cache\includes\elements\modsnippet\29.include.cache.php : 52) Сообщение

Если нужно вывести только отладочную информацию на странице без контента, то добавьте die() или exit()

$modx->log(1, print_r($modx->config, 1),'HTML'); die();

Оставшиеся 2 параметра метода log() отвечают за вывод информации о скрипте и номере строки. Если их не указать, то они определятся автоматически.

// Отладка в методе класса
$modx->log(1, 'Сообщение', '', __METHOD__, __FILE__, __LINE__);
18 октября 2016, 08:13   5149     0

Комментарии ()

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

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.