Рассмотрим один из способов отладки кода с помощью метода 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   5736     0

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

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

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