Вопрос

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

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

Есть ли эквивалент в Magento 2?у меня есть погуглил сайт документации для разработчиков и не увидел ничего очевидного.Есть это Инчу статья, но она была написана почти год назад и с тех пор многое изменилось.

Как разработчик модулей Magento 2, если я хочу заменить следующий код в Magento 1

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

Какой минимум мне нужно сделать?

Это было полезно?

Решение

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

Вы используете отладку, исключение, систему для регистратора PSR, например:

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

Другие советы

в 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));
.

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

Читать дальше по адресу: blog.magePrince.com

Временный журнал печати с новым файлом

$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:

Для печати вывода строки в 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));
.

Если вы хотите использовать регистратор по умолчанию, но пользовательский файл для регистрации (или другой пользовательской логики) необходимо использовать пользовательский обработчик регистратора:

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

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

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

Это все ..

Нет, нет прямого эквивалента.Сейчас немного сложно.

См.: вход в пользовательский файлВ Magento 2

Включите класс Logger PSR в вашем файле с использованием Использование , а затем вызовите метод addDebug().Это будет печатать сообщение журнала в 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");
  }

}
.

Обновлено: 19/08/2019

Если вы ищете элегантный пользовательский хендлер журнала, я рекомендую использовать виртуальные типы (что не нужно добавлять любой PHP-код)

Вдохновлена из ответа Halk , дамы и господа, я представил вам лучший и более короткий путь, а не дублировать пользовательский код журнала все время.

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>
.

Использование

поставщик \ что-то \ model \ 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: виртуальные типы !!!

Надеюсь, это поможет;)

Есть одно обновление для регистратора в 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));
}
.

  1. Вводить $logger класс в конструкторе \Psr\Log\LoggerInterface $logger
    Это достигается путем передачи $logger в качестве аргумента.

  2. Инициализировать $logger в конструкторе

    $this->logger = $logger
    
  3. В функции внутри класса, который вы хотите зарегистрировать, используйте строку ниже

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

Если вам это нужно в своем одном классе с пользовательским файлом журнала:

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'));
}
.

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

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

Тогда вы можете использовать в вашей функции, например:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top