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

 



Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *