Підступна війна росії проти України. Орієнтовні втрати ворога
(станом на 18.11.2022)
83460
осіб
278
літаків
261
гелікоптерів
2879
танків
5808
ББМ
1865
артилерія
209
ППО
393
РСЗВ
4366
машин
16
кораблі і катери
Логування в 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 був корисним!

 

 

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

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