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