Отладка кода в MODX
Рассмотрим один из способов отладки кода с помощью метода modX::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__);
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()