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