Categories: Мадженто 2

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

 

Recent Posts

Обзор WordPress 7.0 «Armstrong»: Новая эра ИИ и масштабная перестройка Core-архитектуры

20 мая 2026 года официально состоялся релиз долгожданной мажорной версии WordPress 7.0 «Armstrong», названной в…

18 часов ago

History Hijacking: Почему Google наказывает за «сломанную» кнопку Назад и как защитить сайт с помощью CSP

Каждый владелец сайта и SEO-специалист ведет ежедневную упорную борьбу за удержание пользователя на страницах вебресурса.…

2 дня ago

Интернет-магазин без лишнего функционала: как не переплатить за разработку на старте

Многие предприниматели сталкиваются с одной и той же проблемой. После утверждения бюджета разработка затягивается, появляются…

3 дня ago

Как выбрать детские бутсы для футбольной секции и не ошибиться с типом подошвы

Футбольная секция быстро показывает, насколько обувь подходит ребенку. Если пара скользит, давит или плохо цепляется…

4 дня ago

Флагманский смартфон: почему стоит купить Samsung Galaxy S26 Ultra

Компания Samsung — один из лидеров на рынке электроники. Ее смартфоны выделяются надежностью, качественными дисплеями,…

4 дня ago

Глагол dar в испанском языке: значение, спряжение и особенности использования

Испанский язык привлекает миллионы людей своей мелодичностью, эмоциональностью и относительной простотой изучения. Одним из важнейших…

1 неделя ago