Логер для MODX
Представляю вам класс-хелпер для удобного логирования. Это надстройка над методом 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.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()