Логирование в 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 был полезным!