В процессе разработки часто возникает необходимость регистрировать (логировать; записывать в логи) переменные или пользовательские сообщения. 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
В Magento 1 мы использовали статический метод:
Mage::logException($e);
В Magento 2 мы используем экземпляр класса Magento\Framework\Logger\Monolog
и метод critical
для регистрации исключений из try-catch
:
$this->_logger->critical($e); // экземпляр $e будет преобразован в строку (будет вызван магический метод __toString())
Давайте начнем с примера того, как получить экземпляр 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 был полезным!
Содержание статьи Введение: почему цены решают все Что значит сравнение цен с конкурентами 5 причин,…
В последние годы интерес к саунам в Киеве заметно вырос. Это связано не только с…
В современном ритме мегаполиса отдых стал неотъемлемой частью заботы о здоровье и эмоциональном состоянии. Особенно…
В современном мире цифрового маркетинга Facebook (Meta) остается одной из самых мощных платформ для продвижения…
Этот прибор стал незаменимым элементом арсенала представителей множества профессий, но особенно актуален среди военных. Тепловизор…
Постоянный поток новостей, рабочих задач и личных забот часто приводит к тому, что в голове…