Magento 2: Заміна методу Mage :: log?


105

У Magento 1, якщо ви хочете відправити повідомлення в журнали, ви використовуєте статичний метод у глобальному Mageкласі.

Mage::log($message, Zend_Log::DEBUG, "my-log-file.log");

Чи є еквівалент у Magento 2? Я гугл через сайт Dev DOCS і нічого очевидного , що висовується не бачив. Є ця стаття Inchoo , але вона майже з року тому і з тих пір багато чого змінилася.

Як розробник модулів Magento 2, якщо я хочу замінити такий код, як наступний в Magento 1

Mage::log($message, Zend_Log::DEBUG, "my-log-file.log");

Що потрібно мінімум робити?

Відповіді:


124
protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
    $this->logger = $logger;
}

Ви використовуєте налагодження, виняток, систему для PSR Logger, наприклад:

$this->logger->info($message);
$this->logger->debug($message);

9
+1 Дякую, це корисний інтерфейс / клас / тип, про який потрібно знати, але з вашої відповіді не зрозуміло, де буде записана інформація та як (якщо можливо) змінити це місце.
Алан Шторм

Ви перевіряєте Manager.php для наступного класу Magento \ Framework \ Event і додаєте цей рядок $ this-> logger-> debug ($ eventName); ніж після оновлення сторінки та перевірте файл debug.txt, ви отримаєте все ім'я evant для певної сторінки.
Пратік

2
Технічно це правильний спосіб інстанціювати реєстратор у ваших власних спеціальних класах - особливо, якщо ви маєте намір утримати його, а не просто швидку налагодження. Однак є декілька основних класів - особливо блоки Block -, які автоматично створюють і зберігають властивість _logger. Якщо ви розширите один із цих основних класів, повторювати логіку не потрібно. Інші відповіді розбираються у створенні обробників для визначення власного файлу журналу, але журнали за замовчуванням завжди /var/log/system.log або /var/log/debug.log. Я вважаю, що конкретна функція реєстрації визначає, яку використовувати.
Джеремі Рімпо

7
Для мене рівень "налагодження" почав працювати лише тоді, коли я ввімкнув "Увійти до файлу" в налаштуваннях> Додатково> Розробник> Налагодження. Використання 2.2
Омер Сабіч

122

У magento2 Ви також можете записувати до журналів, використовуючи Zendбібліотеку, як показано нижче:

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/test.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info('Your text message');

Відредаговано

Ви також можете надрукувати об'єкти та масиви PHP, як показано нижче:

$logger->info(print_r($yourArray, true));

7
+1 Корисно - чи знаєте ви, чи Zend реєстратор автоматично форматуватиме масиви / об’єкти PHP тощо?
Алан Шторм

1
@AlanStorm - Так, ви можете перевірити мою оновлену відповідь.
Манашві Бірла

2
@Manashvibirla: PHP objectsне друкуються ...
zed Blackbeard

1
@KeyurShah Рішення було надано, пам'ятаючи ubuntu, як я використовував ubuntu.! дякую за відгук
Manashvi Birla

3
Кілька з цих відповідей мають своє місце та використання. Очевидно, що для цього рішення потрібно майже стільки ж коду, скільки і використання DI для екземпляра стандартного реєстратора - але це простий на місці випадок, який дозволяє встановити власний файл журналу. Іноді досить прикро шукати стандартні файли журналів - які, як правило, захаращуються - знайти власні журнали. Тож це приємне «швидке» рішення для цього.
Джеремі Рімпо

56
\Magento\Framework\App\ObjectManager::getInstance()
    ->get(\Psr\Log\LoggerInterface::class)->debug('message');

6
+1 Дякую, це корисний інтерфейс / клас / тип, про який потрібно знати, але з вашої відповіді не зрозуміло, де буде записана інформація та як (якщо можливо) змінити це місце.
Алан Шторм

1
Це правильна відповідь.
Медіна

4
Я б не радив безпосередньо використовувати ObjectManager. Використовуйте замість DI
7ochem

12
Хоча я погоджуюся з @ 7ochem, якщо ви створюєте функцію постійної реєстрації, час від часу можна буде вводити тимчасовий вхід до основних (або сторонніх) класів, щоб налагоджувати проблеми. Пройти важкий процес додавання конструктора класу Logger доцільно надмірно складно в цих випадках. Для простої однолінійної функції налагодження це, мабуть, найкраще рішення. Однак вам доведеться займатися пошуком файлів журналу за замовчуванням, щоб знайти власний вихід налагодження.
Джеремі Рімпо

Також майте на увазі, що існує кілька основних класів - особливо класових блоків - які мають властивість _logger, до якого ви можете отримати доступ, не створюючи примірник нової копії.
Джеремі Рімпо

28

Тимчасовий журнал друку з новим файлом

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/logfile.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info('Simple Text Log'); // Simple Text Log
$logger->info('Array Log'.print_r($myArrayVar, true)); // Array Log

Фабричний метод

Для виклику об’єкта реєстратора потрібно ввести клас конструктора \ Psr \ Log \ LoggerInterface

protected $_logger;
public function __construct(
...
\Psr\Log\LoggerInterface $logger
...
) {
    $this->_logger = $logger;
}

public function logExample() {

    //To print string Output in debug.log
    $this->_logger->addDebug('Your Text Or Variables'); 

    // To print array Output in system.log
    $this->_logger->log('600', print_r($yourArray, true));

}

Або ви безпосередньо використовуєте цей код у файлі phtml:

Щоб надрукувати рядок Output в debug.log

\Magento\Framework\App\ObjectManager::getInstance()
   ->get('Psr\Log\LoggerInterface')->debug('Your Message');

Щоб надрукувати вихід масиву в system.log

$myArray = array('test1'=>'123', 'test2'=>'123', 'test3'=>'123');
$level = '100'; // use one of: 100, 200, 250, 300, 400, 500, 550, 600
\Magento\Framework\App\ObjectManager::getInstance()
    ->get('Psr\Log\LoggerInterface')
    ->log($level, print_r($myArray, true));

10

Якщо ви хочете використовувати реєстратор за замовчуванням, але спеціальний файл для ведення журналу (або іншу користувацьку логіку), вам потрібно скористатися користувальницьким обробником реєстратора:

class Logger extends Magento\Framework\Logger\Handler\Base
{
  /**
   * @var string
   */
  protected $fileName = '/var/log/my-log-file.log';

  /**
   * @var int
   */
  protected $loggerType = MonologLogger::DEBUG;
}

Потім додайте його як обробник десь у вашому коді:

protected function addCustomLogHandler()
{
    $logger = Data::getCustomLogger();
    if(isset($this->_logger)){
        $this->_logger->pushHandler($logger);
    }
}

Крок назад у зручності IMO


+1 Корисна інформація, дякую! Однак незрозуміло, як ви використовуєте цей контекст реєстратора за допомогою інтерфейсу автозавантажувача PSR-3 - тобто, якщо ви ведете вхід з ним $this->logger->info($message, $level);- як ви скажете "використовувати мій контекст"?
Алан Шторм

2
Добре, річ у тому, що всі обробники, які є у Monolog, є петельними, і перший, який може обробляти рівень запису (DEBUG, INFO тощо), використовується. Тож єдиний спосіб, яким я бачу бути абсолютно впевненим, що ваш обробник використовується, - це натиснути його перед тим, як вам це потрібно, тому його вершина стопки і виходить першою в циклі. Іншим способом було б просто встановити це як обробник, видаливши всі інші, але це не буде дуже дружньою справою.
Петро Джамбазов

Якщо ви спробуєте ввести додаткові обробники в 2.0.0 GA або працюєте із зазначенням обробників у di.xml, можливо, ви хочете бути в курсі цього питання github.com/magento/magento2/isissue/2529 Я зіткнувся з цією проблемою, намагаючись щоб отримати користувальницький реєстратор, щоб мати власну ручку файлу журналу, і спеціальний обробник, який записує деякі записи в таблицю бази даних.
mttjohnson

9

Простим способом, якщо ви не хочете створювати ін'єкцію залежностей або що-небудь інше, що використовується нижче коду, він зберігатиме system.logфайл входу

$logger = \Magento\Framework\App\ObjectManager::getInstance()->get(\Psr\Log\LoggerInterface::class);
$logger->info('message');

Це все..


5

Ні, прямого еквівалента немає. Зараз це трохи складно.

Див.: Вхід у користувацький файл у Magento 2


1
+1, дякую! Однак - за іншими відповідями це здається, що може бути один реєстратор, і підхід для розширення / створення ручки вже не потрібен. Чи знаєте ви, чи це правда?
Алан Шторм

4

Включіть у свій файл клас реєстратора psr, використовуючиaddDebug() метод use та тоді виклик . Це надрукує повідомлення журналу у var/log/debug.logфайлі

use Psr\Log\LoggerInterface;

class demo {
  function demo()
  {
    //EDIT: Using debug instead of addDebug for PSR compatiblity
    $this->_objectManager->get('Psr\Log\LoggerInterface')->debug("your message goes here");
  }

}

2
ви не повинні використовувати addDebug, оскільки це не сумісний з програмою реєстрації програм. використовувати замість цього просто налагодження.
Мацей Папроцький

4

ОНОВЛЕНО: 19.08.2019

Якщо ви шукаєте елегантний користувальницький обробник журналу, рекомендую вам використовувати віртуальні типи (до яких не потрібно додавати PHP-код)

Надихнувшись від відповіді Петра Джамбазова та халка , пані та панове, я представив вам кращий та коротший спосіб замість дублювання користувацького коду журналу весь час.

StackOverflow \ Example \ etc \ di.xml

<!-- Custom log file for StackOverflow ; Duplicate it as much as you want separate log file -->
<virtualType name="StackOverflow\Example\Model\Logger\VirtualDebug" type="Magento\Framework\Logger\Handler\Base">
    <arguments>
        <argument name="fileName" xsi:type="string">/var/log/stackoverflow/donald_trump.log</argument>
    </arguments>
</virtualType>
<virtualType name="StackOverflow\Example\Model\Logger\VirtualLogger" type="Magento\Framework\Logger\Monolog">
    <arguments>
        <argument name="name" xsi:type="string">DonaldTrump</argument>
        <argument name="handlers" xsi:type="array">
            <item name="debug" xsi:type="object"> StackOverflow\Example\Model\Logger\VirtualDebug</item>
        </argument>
    </arguments>
</virtualType>

ВИКОРИСТАННЯ

Постачальник \ Щось \ Модель \ DonaldTrump.php

<?php
/**
 * Copyright © 2016 Toan Nguyen <https://nntoan.github.io>. All rights reserved.
 * See COPYING.txt for license details.
 *
 * This is the file you want to inject your custom logger.
 * Of course, your logger must be an instance of \Psr\Log\LoggerInterface.
 */

namespace Vendor\Something\Model;

/**
 * DonaldTrump business logic file
 *
 * @package Vendor\Something\Model
 * @author  Toan Nguyen <https://github.com/nntoan>
 */
class DonaldTrump
{
    /**
     * @var \Psr\Log\LoggerInterface
     */
    private $logger;

    /**
     * DonaldTrump constructor.
     *
     * @param \Psr\Log\LoggerInterface $logger
     */
    public function __construct(
        \Psr\Log\LoggerInterface $logger,
    ) {
        $this->logger = $logger;
    }

    // 1 billion lines of code after this line
}

StackOverflow \ Example \ etc \ frontend \ di.xml

<type name="Vendor\Something\Model\DonaldTrump">
    <arguments>
        <argument name="logger" xsi:type="object">StackOverflow\Example\Model\Logger\VirtualLogger</argument>
    </arguments>
</type>

Це все, без зайвих PHP-файлів чи ліній - використовуйте переваги Magento 2: Virtual Types !!!

Сподіваюся, це допомагає;)


3
Цей код реалізує PSI? (Ін'єкція політичних заяв): П
оч

1
@ 7ochem О так, це так: v
Toan Nguyen

2

Є одне оновлення для реєстратора в 2.2. Ви можете увімкнути реєстратор у виробничому режимі, запустивши SQL:

 "INSERT INTO core_config_data (scope, scope_id, path, value) VALUES ('default', '0', 'dev/debug/debug_logging', '1');"

Тоді ви можете використовувати \Psr\Log\LoggerInterface для журналу друку так само, як вище відповіді:

protected $logger;

public function __construct(
  \Psr\Log\LoggerInterface $logger
) {
    $this->logger = $logger;
  }

public function yourFunction() {
    $data = ["test" => "testing"];
    $this->logger->debug(var_export($data, true));
}

дякую, і ви також можете використовувати це замість QUERY SQL:In the Magento admin panel, go to "Stores" -> "Configuration" -> "Advanced" -> "Developer" -> "Debug" -> "Log to File". Setting this to "Yes" will cause debug information to be logged to var/log/debug.log in your Magento application directory.
fudu

1
  1. $loggerКлас введення в конструктор \Psr\Log\LoggerInterface $logger
    Це досягається передачею $ logger як аргументу.

  2. Ініціалізувати $loggerв конструкторі

    $this->logger = $logger
  3. Для функціонування в класі, який потрібно ввійти, використовуйте рядок нижче

    $this->logger->debug($message);
    $this->logger->log($level, $message);

1

Якщо вам це потрібно у вашому єдиному класі зі спеціальним файлом журналу:

public function __construct(\Psr\Log\LoggerInterface $logger, \Magento\Framework\App\Filesystem\DirectoryList $dir) 
{
    $this->logger = $logger;
    $this->dir = $dir;

    $this->logger->pushHandler(new \Monolog\Handler\StreamHandler($this->dir->getRoot().'/var/log/custom.log'));
}

0

Розмістіть код реєстратора PSR у своєму конструкторі:

protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
    $this->logger = $logger;
}

то ви можете використовувати у своїй функції, як:

$this->logger->info($message);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.