Question

Dans Magento 1, si vous vouliez envoyer un message aux logs, vous utiliseriez une méthode statique sur le global Mage classe.

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

Existe-t-il un équivalent dans Magento 2 ?j'ai recherché sur Google le site de documentation de développement et je n'ai rien vu d'évident qui ressorte.Il y a cet Inchoo article, mais il date d'il y a presque un an et beaucoup de choses ont changé depuis.

En tant que développeur de modules Magento 2, si je souhaite remplacer le code comme celui-ci dans Magento 1

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

Quel est le strict minimum que je dois faire ?

Était-ce utile?

La solution

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

Vous utilisez le débogage, l'exception, le système pour PSR Logger par exemple :

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

Autres conseils

Dans magento2, vous pouvez également écrire dans les journaux en utilisant le Zend bibliothèque comme ci-dessous :

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

Édité

Vous pouvez également imprimer des objets et tableaux PHP comme ci-dessous :

$logger->info(print_r($yourArray, true));
\Magento\Framework\App\ObjectManager::getInstance()
    ->get(\Psr\Log\LoggerInterface::class)->debug('message');

Lire la suite sur: blog.mageprince.com

Journal d'impression temporaire avec nouveau fichier

$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

Méthode d'usine

Il faut injecter \Psr\Log\LoggerInterface classe dans le constructeur pour appeler l'objet enregistreur

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

}

Ou vous utilisez directement ce code dans le fichier phtml :

Pour imprimer la chaîne de sortie dans debug.log

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

Pour imprimer la sortie du tableau dans 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));

Si vous souhaitez utiliser l'enregistreur par défaut mais un fichier personnalisé pour la journalisation (ou une autre logique personnalisée), vous devez utiliser un gestionnaire d'enregistreur personnalisé :

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

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

Ajoutez-le ensuite en tant que gestionnaire quelque part dans votre code :

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

Un pas en arrière dans la commodité IMO

D'une manière simple, si vous ne souhaitez pas créer d'injection de dépendances ou quoi que ce soit d'autre, utilisez le code ci-dessous, il stockera la connexion system.log déposer

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

C'est tout..

Non, il n'y a pas d'équivalent direct.C'est un peu compliqué maintenant.

Voir: Connexion à un fichier personnalisé dans Magento 2

Incluez la classe psr logger dans votre fichier en utilisant utiliser puis appelle addDebug() méthode.Cela imprimera le message du journal dans var/log/debug.log déposer

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");
  }

}

MIS À JOUR:19/08/2019

Si vous recherchez un gestionnaire de journaux personnalisé et élégant, je vous recommande d'utiliser les types virtuels (qui ne nécessitent pas d'ajout de code PHP)

Inspiré de la réponse de Petar Dzhambazov et Halte, mesdames et messieurs, je vous ai présenté un moyen meilleur et plus court au lieu d'un code de journal personnalisé dupliqué à tout moment.

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>

USAGE

Fournisseur\Quelque chose\Modèle\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>

C'est tout, pas de fichiers ni de lignes PHP supplémentaires - profitez des avantages de Magento 2 :Types virtuels !!!

J'espère que cela t'aides ;)

Il y a une mise à jour pour l'enregistreur dans la version 2.2.Vous pouvez activer l'enregistreur pour le mode production en exécutant SQL :

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

Ensuite, vous pouvez utiliser \Psr\Log\LoggerInterface pour le journal d'impression, tout comme les réponses ci-dessus :

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. Injecter $logger classe dans le constructeur \Psr\Log\LoggerInterface $logger
    Ceci est réalisé en passant $logger comme argument.

  2. Initialiser $logger chez le constructeur

    $this->logger = $logger
    
  3. En fonction au sein de la classe que vous souhaitez enregistrer, utilisez la ligne ci-dessous

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

Si vous en avez besoin dans votre classe unique avec un fichier journal personnalisé :

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

Placez le code de l'enregistreur PSR dans votre constructeur :

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

alors vous pouvez utiliser dans votre fonction comme :

$this->logger->info($message);
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top