Представляю вам класс-хелпер для удобного логирования. Это надстройка над методом xPDO::log() и немного упрощает отладку. В любых файлах и классах используется одинаковый синтаксис и нет заморочек с тем, где писать $modx->log(), где $this->modx->log(), а где $xpdo->log() или $this->xpdo->log(). Вызов логера одинаков в любом месте — Logger::error(). Доступны также методы warn(), info() и debug(). Короткий и понятный синтаксис. Ещё одно его важное достоинство — его можно использовать даже в тех классах, где не определён объект $modx. Вот так он выглядит:

class Logger
{
    /** @var  modX $modx */
    protected static $modx;

    public static function error($message, $changeLevel = false)
    {
        self::process(modX::LOG_LEVEL_ERROR, $message, $changeLevel);
    }
    public static function warn($message, $changeLevel = false)
    {
        self::process(modX::LOG_LEVEL_WARN, $message, $changeLevel);
    }
    public static function info($message, $changeLevel = false)
    {
        self::process(modX::LOG_LEVEL_INFO, $message, $changeLevel);
    }
    public static function debug($message, $changeLevel = false)
    {
        self::process(modX::LOG_LEVEL_DEBUG, $message, $changeLevel);
    }

    protected static function process($level, $message, $changeLevel)
    {
        if (!isset(self::$modx) || !(self::$modx instanceof modX)) {
            self::$modx = new modX();
        }
        if (is_array($message) || is_object($message)) $message = print_r($message,1);
        
        // Если запись идет не в файл, а выводится на страницу, то оформляем с помощью стилей.
        if (self::$modx->getLogTarget() == 'HTML') {
            $message = '<style>body>h5,body>h5+pre {background-color:#002357;color:#fcffc4;margin:0;padding:5px}</style>' . $message;
        }
        
        if ($changeLevel) {
            $oldLevel = self::$modx->setLogLevel($level);
            self::$modx->log($level, $message);
            self::$modx->setLogLevel($oldLevel);
        } else {
            self::$modx->log($level, $message);
        }
    }
}

Синтаксис вызова очень простой — Logger::метод('Сообщение').

// Запись ошибки
Logger::error('Сообщение');
// Запись предупреждения
Logger::warn('Сообщение');
// Запись информационного сообщения
Logger::info('Сообщение');
// Запись сообщения отладки
Logger::debug('Сообщение');

У всех методов есть второй параметр, указывающий, нужно ли переключать уровень логирования. Ведь если текущий уровень ниже того, который указываете вы, то сообщение записано не будет. Об это я писал тут. Поэтому, если указать вторым параметром TRUE, то текущий уровень временно переключится на указанный вами и после записи вернётся обратно. Т.е. если вы вызовите Logger::debug('Сообщение', true), то в журнале появится запись, даже если уровень логирования равен 1 (только ошибки):

[2016-12-24 19:59:59] (DEBUG @ /www/core/model/modx/modx.class.php : 2753) Сообщение

Что ещё из удобного. Если в качестве сообщения передаётся массив или объект, то вместо слова 'array' будет записан результат функции print_r. Также, если сообщения выводятся на экран (logTarget = 'HTML'), то блок с ошибками подсвечивается.

Я не стал его оформлять в пакет, а предлагаю простое решение — создать плагин на событие OnMODXInit

switch ($modx->event->name) {
    case 'OnMODXInit':
    // Создадим файл для этого класса и подключим его
        $file = MODX_CORE_PATH . 'classes/logger.class.php';
        if (file_exists($file)) {
            require_once $file;
        }
        break;
}

Второй вариант (менее феншуйный, но более простой) — добавить его в файл config.core.php, который лежит в корне. Его, как правило, при обновлении не трогают. Если вы планируете добавлять ещё классы, то лучше создать файлы классов отдельно, например, в папке core/classes, а в файле config.core.php подключать их через require:

<?php
//Подключаем все классы в папке.
$classPath= MODX_CORE_PATH . 'classes/';
if (file_exists($classPath)) {
    $files= scandir($classPath);
    foreach ($files as $file) {
        if (preg_match('/.+\.class.php$/',$file)) {
            require $classPath . $file;
        }
    }
}

Подключать можно не только классы, но и библиотеки с функциями.

Happy end.

25 декабря 2016, 11:14   922     0

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

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

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