Коварная война россии против Украины. Ориентировочные потери врага
(по состоянию на 29.05.2024)
505100
солдат
357
самолетов
326
вертолетов
7700
танков
14891
ББМ
13066
артиллерия
815
ПВО
1087
РСЗО
17796
машин
27
корабли и катера
Логирование в Magento 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 был полезным!

 

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *