Frage

Wenn Sie in Magento 1 eine Nachricht an die Protokolle senden möchten, verwenden Sie eine statische Methode auf globaler Ebene Mage Klasse.

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

Gibt es ein Äquivalent in Magento 2?Ich habe durchgegoogelt Ich habe die Website mit den Entwicklungsdokumenten durchgesehen und nichts Auffälliges gesehen, das herausspringt.Es gibt dieser Inchoo Artikel, aber er ist fast ein Jahr her und seitdem hat sich so viel verändert.

Wenn ich als Magento 2-Modulentwickler Code wie den folgenden in Magento 1 ersetzen möchte

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

Was ist das Nötigste, was ich tun muss?

War es hilfreich?

Lösung

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

Sie verwenden beispielsweise Debug, Exception, System für PSR Logger:

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

Andere Tipps

In Magento2 können Sie auch mit in die Protokolle schreiben Zend Bibliothek wie unten:

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

Bearbeitet

Sie können PHP-Objekte und Arrays auch wie folgt drucken:

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

Lesen Sie mehr unter: blog.mageprince.com

Temporäres Druckprotokoll mit neuer Datei

$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

Fabrikmethode

Sie müssen spritzen \Psr\Log\LoggerInterface Klasse in den Konstruktor, um das Logger-Objekt aufzurufen

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

}

Oder Sie verwenden diesen Code direkt in der HTML-Datei:

Zum Drucken der Zeichenfolgenausgabe in debug.log

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

So drucken Sie die Array-Ausgabe in 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));

Wenn Sie den Standard-Logger, aber eine benutzerdefinierte Datei für die Protokollierung (oder eine andere benutzerdefinierte Logik) verwenden möchten, müssen Sie einen benutzerdefinierten Logger-Handler verwenden:

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

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

Fügen Sie es dann irgendwo in Ihrem Code als Handler hinzu:

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

Meiner Meinung nach ein Schritt zurück in Sachen Bequemlichkeit

Wenn Sie keine Abhängigkeitsinjektion oder etwas anderes erstellen möchten, verwenden Sie auf einfache Weise den folgenden Code, um die Anmeldung zu speichern system.log Datei

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

Das ist alles..

Nein, es gibt kein direktes Äquivalent.Es ist jetzt etwas kompliziert.

Sehen: Protokollierung in einer benutzerdefinierten Datei in Magento 2

Fügen Sie die psr-Logger-Klasse mit in Ihre Datei ein verwenden und dann anrufen addDebug() Methode.Dadurch wird eine Protokollmeldung gedruckt var/log/debug.log Datei

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

}

AKTUALISIERT:19.08.2019

Wenn Sie nach einem eleganten benutzerdefinierten Protokollhandler suchen, empfehle ich Ihnen die Verwendung von Virtual Types (für das kein PHP-Code hinzugefügt werden muss).

Inspiriert von der Antwort von Petar Dzhambazov Und Halk, Meine Damen und Herren, ich habe Ihnen einen besseren und kürzeren Weg vorgestellt, anstatt ständig benutzerdefinierten Protokollcode zu duplizieren.

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>

VERWENDUNG

Vendor\Something\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>

Das ist alles, keine zusätzlichen PHP-Dateien oder -Zeilen – nutzen Sie die Vorteile von Magento 2:Virtuelle Typen!!!

Hoffe das hilft ;)

Es gibt ein Update für Logger in 2.2.Sie können den Logger für den Produktionsmodus aktivieren, indem Sie SQL ausführen:

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

Dann können Sie verwenden \Psr\Log\LoggerInterface zum Drucken des Protokolls wie oben beschrieben:

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. Injizieren $logger Klasse im Konstruktor \Psr\Log\LoggerInterface $logger
    Dies wird erreicht, indem $logger als Argument übergeben wird.

  2. Initialisieren $logger im Konstruktor

    $this->logger = $logger
    
  3. Verwenden Sie in der Funktion innerhalb der Klasse, die Sie protokollieren möchten, die folgende Zeile

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

Wenn Sie es innerhalb Ihrer einzelnen Klasse mit benutzerdefinierter Protokolldatei benötigen:

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

Platzieren Sie den PSR-Logger-Code in Ihrem Konstruktor:

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

dann können Sie in Ihrer Funktion Folgendes verwenden:

$this->logger->info($message);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top