Логування в 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 був корисним!