Magento 2: Mage için değiştirme :: log yöntemi?


105

Magento 1'de, kayıtlara bir mesaj göndermek istiyorsanız, global Magesınıfta statik bir yöntem kullanırsınız .

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

Magento 2'de eşdeğeri var mı? Ben ettik aracılığıyla googled dev dokümanlar site ve dışarı çıkar bariz bir şey görmedim. Orada bu Inchoo makale, ama neredeyse bir yıl öncesine var ve daha o zamandan beri değişti.

Magento 2 modül geliştiricisi olarak, Magento 1'deki gibi bir kodu değiştirmek istersem

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

Yapmam gereken asgari çıplaklık nedir?

Yanıtlar:


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

Örneğin PSR Logger için hata ayıklama, istisna, sistem kullanıyorsunuz:

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

9
+1 Teşekkürler, bu bilmek yararlı bir arayüz / sınıf / türdür - ancak bilginin nerede kaydedileceği ve bu konumun nasıl (eğer mümkünse) değiştirileceği cevabınızdan net değildir.
Alan Storm,

Magento \ Framework \ Event sınıfını takip etmek için Manager.php dosyasını kontrol edin ve bu satırı $ this-> logger-> debug ($ eventName); Sayfayı yeniledikten sonra ve debug.txt dosyasını kontrol ettikten sonra, belirli sayfalar için tüm evreni isimlerini alırsınız.
Pratik

2
Teknik olarak, bu, kendi özel sınıflarınızda bir kaydediciyi somutlaştırmanın 'doğru' yoludur - özellikle de sadece hızlı bir hata ayıklamadan ziyade çevresinde kalmayı düşünüyorsanız. Bununla birlikte, bir _logger özelliğini otomatik olarak başlatan ve depolayan birkaç temel sınıf vardır - özellikle Blok sınıfları -. Bu temel sınıflardan birini genişletirseniz, mantığı tekrarlamanıza gerek kalmaz. Diğer cevaplar kendi günlük dosyanızı tanımlamak için işleyiciler oluşturmaya çalışır, ancak varsayılan günlükler her zaman /var/log/system.log veya /var/log/debug.log şeklindedir. Özel kayıt fonksiyonunun hangisinin kullanıldığını belirlediğine inanıyorum.
Jeremy Rimpo,

7
Benim için "hata ayıklama" düzeyi yalnızca Yapılandırma> Gelişmiş> Geliştirici> Hata Ayıklama'da "Dosyaya giriş yap" özelliğini etkinleştirdiğimde çalışmaya başladı. 2.2
Omer Sabiç

122

Magento2'de ayrıca Zendaşağıdaki gibi kütüphaneyi kullanarak loglara yazabilirsiniz :

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

Düzenlenen

Ayrıca PHP nesnelerini ve dizilerini aşağıdaki gibi yazdırabilirsiniz:

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

7
+1 Yararlı - Zend logger'ın PHP dizilerini / nesneleri vb.
Alan Storm,

1
@AlanStorm - Evet, güncellenmiş cevabımı kontrol edebilirsiniz.!
Manashvi Birla

2
@Manashvibirla: PHP objectsyazdırılmıyor ...
zed Blackbeard

1
@KeyurShah ubuntu'yu kullanırken olduğu gibi ubuntu akılda tutularak çözüm sağlandı.! Geri bildiriminiz için teşekkürler
Manashvi Birla

3
Bu cevapların birçoğunun yeri ve kullanımı var. Açıkçası, bu çözüm, standart kayıt cihazını başlatmak için DI kullanımı kadar kod gerektiriyor - fakat kendi kayıt dosyanızı ayarlamanıza izin veren basit bir yerinde bırakma. Bazen kendi günlüklerinizi bulmak için standart günlük dosyalarında arama yapmak oldukça sıkıcıdır. Yani bu bunun için güzel bir 'hızlı' çözüm.
Jeremy Rimpo,

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

6
+1 Teşekkürler, bu bilmek yararlı bir arayüz / sınıf / türdür - ancak bilginin nerede kaydedileceği ve bu konumun nasıl (eğer mümkünse) değiştirileceği cevabınızdan net değildir.
Alan Storm,

1
Doğru cevap bu.
medina

4
Doğrudan ObjectManager'ı kullanmanızı tavsiye etmem. Bunun yerine DI kullanın
18'de 7ochem

12
Kalıcı bir kayıt işlevi oluşturuyorsanız @ 7ochem ile aynı fikirdeyken, zaman zaman hata ayıklamak için zaman zaman çekirdek (ya da üçüncü taraf) sınıflara geçici kayıt yapmak gerekebilir. Yapıcıya bir Logger sınıfı ekleme zorlu sürecinden geçmek, bu durumlarda çok fazla karmaşıktır. Basit, tek satırlı bir hata ayıklama işlevi için bu muhtemelen en iyi çözümdür. Bununla birlikte, kendi hata ayıklama çıktınızı bulmak için varsayılan günlük dosyalarında arama yapmanız gerekir.
Jeremy Rimpo,

Ayrıca, yeni bir kopya oluşturmadan erişebileceğiniz bir _logger özelliğine sahip birkaç temel sınıfın (özellikle de Blok sınıflarının) olduğunu unutmayın.
Jeremy Rimpo,

28

Yeni dosya ile geçici baskı günlüğü

$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

Fabrika yöntemi

Logger nesnesini çağırmak için \ Psr \ Log \ LoggerInterface sınıfını yapıcıya enjekte etmeniz gerekir

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

}

Veya bu kodu doğrudan phtml dosyasında kullanırsınız:

String Çıktısını debug.log içinde yazdırmak için

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

System.log dosyasında dizi çıkışı yazdırmak için

$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

Varsayılan logger'ı kullanmak, ancak logging için özel bir dosya (veya başka bir özel mantık) kullanmak istiyorsanız, özel logger işleyicisi kullanmanız gerekir:

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

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

Sonra kodunuzda bir yere işleyici olarak ekleyin:

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

Rahatlıkta bir adım geri IMO


+1 Yararlı bilgiler, teşekkür ederim! Ancak, bu logger içeriğini PSR-3 otomatik yükleyici arayüzü ile nasıl kullandığınız belli değil - yani eğer giriş yapıyorsanız $this->logger->info($message, $level);- "bağlamımı kullan" nasıl denir?
Alan Storm,

2
İşin aslı, Monolog için mevcut olan tüm işleyicilerin ilmekli olması ve ilk önce kayıt seviyesini (DEBUG, INFO vb.) Kaldırabilmesi. Bu yüzden, işleyicinizin kullanıldığından emin olduğumdan emin olduğum tek yol, ihtiyaç duymadan önce itmek, yani yığının en üstünde ve ilk önce döngüde geliyor. Başka bir yol da bunu sadece işleyici olarak ayarlamak, tüm diğerlerini kaldırmak olacak, ama bu yapılacak çok kolay bir şey olmayacak.
Petar Dzhambazov,

Eğer 2.0.0 GA ek işleyicileri tanıtmak veya di.xml işleyicileri belirterek çalışmayı denerseniz bu sorunun farkında olmak isteyebilirsiniz github.com/magento/magento2/issues/2529 denemekten bu konuda koştu Özel bir günlük dosyası tanıtıcısı ve bazı girişleri veritabanı tablosuna yazan özel bir tanıtıcıya sahip olmak için
mttjohnson

9

Basit bir şekilde, o giriş saklayacak kodunun altında bağımlılık enjeksiyon veya başka bir şey kullanımını oluşturmak istemiyorsanız system.logdosyası

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

Bu kadar..


5

Hayır, doğrudan eşdeğeri yoktur. Şimdi biraz karışık.

Bkz .: Magento 2'de özel bir dosyaya giriş yapma


1
+1, teşekkür ederim! Ancak - diğer cevaplar, tek bir kayıt cihazı olabileceği gibi ses çıkarır ve bir tanıtıcı yaklaşımını genişletme / oluşturma artık gerekli değildir. Bunun doğru olup olmadığını biliyor musunuz?
Alan Storm,

4

Dosyanıza use ve ardından call addDebug()yöntemini kullanarak psr logger sınıfını ekleyin . Bu var/log/debug.logdosyaya log mesajı yazdıracak

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 ujse kullanmamalısınız, çünkü psr logger uyumlu değildir. bunun yerine sadece hata ayıklamayı kullanın.
Maciej Paprocki

4

GÜNCELLEME: 19/08/2019

Zarif özel günlük işleyici arıyorsanız, Sanal Türler kullanmanızı tavsiye ederim (herhangi bir PHP kodu eklemeniz gerekmez)

Cevabını dan esinlenerek Petar Dzhambazov ve Halk Bankalarının , bayanlar ve Sana daha iyi ve daha kısa bir yol yerine yinelenen özel günlüğü kodunu her zaman tanıtıldı beyler.

StackOverflow \ Örnek \ vb \ 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>

KULLANIM

Satıcı \ şey \ 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 \ Örnek \ vb \ önyüz \ di.xml

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

Hepsi bu, ekstra PHP dosyası veya satırı yok - Magento 2'nin avantajlarını kullanın: Sanal Türler !!!

Bu yardımcı olur umarım ;)


3
Bu kod PSI'yı uyguluyor mu? (Politik İfade Enjeksiyonu): P
7ochem

1
@ 7ochem Oh evet, öyle: v
Toan Nguyen

2

2.2'de logger için bir güncelleme var. Logger'ı üretim modu için SQL'i çalıştırarak etkinleştirebilirsiniz:

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

Daha sonra \Psr\Log\LoggerInterface yukarıdaki cevaplarda olduğu gibi baskı günlüğü için kullanabilirsiniz :

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

teşekkürler, ve bunu QUERY SQL yerine de kullanabilirsiniz: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. Yapıcıya $loggersınıf enjekte \Psr\Log\LoggerInterface $logger
    edilir Bu, $ logger'ı argüman olarak ileterek elde edilir.

  2. Başlat $loggeryapıcı içinde

    $this->logger = $logger
  3. Günlüğe kaydetmek istediğiniz sınıf içindeki işlevde aşağıdaki satırı kullanın

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

1

Özel günlük dosyası ile kendi sınıfınızda ihtiyacınız varsa:

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 logger kodunu yapıcınıza yerleştirin:

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

sonra işlevinde gibi kullanabilirsiniz:

$this->logger->info($message);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.