Логирование в Magento 2
В процессе разработки часто возникает необходимость регистрировать (логировать; записывать в логи) переменные или пользовательские сообщения. Magento 2 поставляется со встроенным средством логирования, которое основано на библиотеке Monolog (этот пакет находится по адресу: /vendor/monolog). В сегодняшней статье мы вкратце рассмотрим процесс логирования в Мадженто 2, а также рассмотрим вопрос создания собственного лога.
Основным классом для ведения логов в Magento 2 является Magento\Framework\Logger\Monolog
, и он определен в app/etc/di.xml так:
<preference for="Psr\Log\LoggerInterface" type="Magento\Framework\Logger\Monolog" />
Вы можете видеть, что этот класс расширяет класс Monolog\Logger
из пакета monolog.
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */namespace Magento\Framework\Logger; use Monolog\Logger; class Monolog extends Logger { … }
В классе Monolog\Logger
есть несколько интересных методов для создания логов.
Эти методы принимают два аргумента, первый аргумент – это сообщение (строка), а второй – необязательный параметр массива (вы можете передать экземпляр объекта).
Вот некоторые методы:
$this->_logger->debug($message); // файл лога: var/log/debug.log $this->_logger->info($message); // файл лога: var/log/system.log $this->_logger->alert($message); // файл лога: var/log/system.log $this->_logger->notice($message); // файл лога: var/log/system.log $this->_logger->error($message); // файл лога: var/log/system.log $this->_logger->critical($e); // файл лога: var/log/exception.log
Пример логирования PHP исключения:
В Magento 1 мы использовали статический метод:
Mage::logException($e);
В Magento 2 мы используем экземпляр класса Magento\Framework\Logger\Monolog
и метод critical
для регистрации исключений из try-catch
:
$this->_logger->critical($e); // экземпляр $e будет преобразован в строку (будет вызван магический метод __toString())
Создание собственного лога (журнала ошибок) в Magento 2
Давайте начнем с примера того, как получить экземпляр Magento\Framework\Logger\Monolog
в своем классе.
Magento 2 использует инъекцию зависимостей, и все экземпляры классов проходят через конструктор класса.
Если вы хотите использовать объект Magento\Framework\Logger\Monolog
, тогда его экземпляр должен быть передан через конструктор вашего класса.
Пример этого кода показан ниже:
<?php namespace Sebweo\TestModule\Model; class LogTest{ protected $_logger; public function __construct( \Psr\Log\LoggerInterface $logger, //инъекция лога array $data = [] ) { $this->_logger = $logger; parent::__construct($data); } public function testMethod() { /* здесь основная логика метода */ // доступ к экземпляру журнала ошибок и вызов метода лога $this->_logger->debug('некий текст или же переменная'); } }
Вы можете видеть, что мы передали \Psr\Log\LoggerInterface $logger
в классе через конструктор, чтобы иметь возможность использовать объект лога в этом классе.
После этого мы можем использовать экземпляр $this->_logger
в классе Sebweo\TestModule\Model\LogTest
.
Если вы хотите записать лог в свой собственный файл, тогда этот процесс не так прост и вам придется создать собственный обработчик журнала ошибок.
Основной класс лога в Magento 2 имеет два обработчика, которые определены в файле app/etc/di.xml. Эти обработчики: System и Debug.
<type name="Magento\Framework\Logger\Monolog"> <arguments> <argument name="name" xsi:type="string">main</argument> <argument name="handlers" xsi:type="array"> <item name="system" xsi:type="object">Magento\Framework\Logger\Handler\System</item> <item name="debug" xsi:type="object">Magento\Framework\Logger\Handler\Debug</item> </argument> </arguments> </type>
В некоторых классах нам не нужно передавать объект журнала ошибок через конструктор, потому что в них объект лога уже существует.
Например, такая ситуация есть в каждом классе html-блоков, которые расширяют \Magento\Framework\View\Element\Template
, или в классе Модели, которая расширяет \Magento\Framework\Model\AbstractModel
.
Эти «родительские» классы уже имеют свойства $_logger
экземпляра Magento\Framework\Logger
.
Вот и все! Надеемся, что для вас этот краткий обзор логирования в Magento 2 был полезным!
Последние посты
Генри Форд
Человек имеет два мотива поведения — один настоящий и второй, который красиво звучит Генри Форд…
Фридрих Ницше
Не нужно додумывать слишком много. Так вы создаете проблемы, которых изначально не было Фридрих Ницше…
Такой разный инвертор! Выбираем между кондиционерами Inverter, Inverter DC и Full DC
Лето в разгаре, а значит самое время задуматься о покупке кондиционера. Но как не потеряться…
Омар Хайям
Настоящий друг — это человек, который в глаза тебе выскажет все, что о тебе думает,…
Полезные советы по выбору раздвижной двери
Следует знать, что функциональность и дизайн работают рука об руку, когда вы используете раздвижную дверь.…