Magento 2: Mage के लिए प्रतिस्थापन :: लॉग विधि?


105

Magento 1 में, यदि आप लॉग में संदेश भेजना चाहते हैं, तो आप वैश्विक Mageकक्षा पर एक स्थिर विधि का उपयोग करेंगे ।

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

क्या Magento 2 में एक बराबर है? मैंने देव डॉक्स साइट के माध्यम से गुगली की है और कुछ भी स्पष्ट नहीं देखा है जो बाहर निकलता है। नहीं है इस 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 लकड़हारा के लिए डिबग, अपवाद, प्रणाली का उपयोग करते हैं:

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

9
+1 धन्यवाद, यह जानने के लिए एक उपयोगी इंटरफ़ेस / वर्ग / प्रकार है - लेकिन यह आपके उत्तर से स्पष्ट नहीं है कि जानकारी कहाँ लॉग की जाएगी और कैसे (यदि संभव हो) उस स्थान को बदलने के लिए।
एलन स्टॉर्म

आप निम्न वर्ग Magento \ Framework \ Event के लिए Manager.php की जाँच करें और इस लाइन को $ जोड़ें-> लकड़हारा-> डिबग ($ eventName); ताज़ा पृष्ठ के बाद और डिबग.टेक्स्ट फ़ाइल की जांच करने के बाद आपको विशिष्ट पृष्ठ के लिए सभी स्पष्ट नाम मिलते हैं।
प्रतिक

2
तकनीकी रूप से, अपने स्वयं के कस्टम वर्गों में लकड़हारे को तुरंत हटाने का यह 'सही' तरीका है - खासकर यदि आप इसे केवल कुछ त्वरित डिबग के बजाय इसे आसपास रखने का इरादा रखते हैं। हालांकि, कई मुख्य वर्ग हैं - विशेष रूप से ब्लॉक कक्षाएं - जो स्वचालित रूप से एक _logger संपत्ति को तुरंत और स्टोर करती हैं। यदि आप इनमें से किसी एक कोर क्लास का विस्तार करते हैं तो तर्क को दोहराने की आवश्यकता नहीं है। अन्य उत्तर आपकी स्वयं की लॉग फ़ाइल को परिभाषित करने के लिए हैंडलर बनाने में खुदाई करते हैं, लेकिन डिफ़ॉल्ट लॉग हमेशा /var/log/system.log या /var/log/debug.log होते हैं। मेरा मानना ​​है कि विशिष्ट लॉगिंग फ़ंक्शन निर्धारित करता है जिसका उपयोग किया जाता है।
जेरेमी रिम्पो

7
मेरे लिए, "डिबग" स्तर ने तभी काम करना शुरू किया जब मैंने कॉन्फ़िगरेशन> उन्नत> डेवलपर> डीबग में "लॉग इन फ़ाइल" को सक्षम किया। 2.2 का उपयोग करना
ओमेर सबिक

121

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
@ मानशिवबर्ला: PHP objectsछपाई नहीं कर रहे हैं ...
zed Blackbeard

1
@KeyurShah उबंटू को ध्यान में रखते हुए समाधान प्रदान किया गया था, जैसा कि मैं ubuntu का उपयोग कर रहा था। प्रतिक्रिया के लिए धन्यवाद
मानशिव बिरला

3
इनमें से कई उत्तरों का अपना स्थान और उपयोग है। स्पष्ट रूप से इस समाधान के लिए मानक लकड़हारे को तुरंत हटाने के लिए डि का उपयोग करने के लिए लगभग उतना ही कोड की आवश्यकता होती है - लेकिन यह एक सरल इन-प्लेस ड्रॉप-इन है जिसमें आप अपनी लॉग फ़ाइल सेट कर सकते हैं। कभी-कभी यह मानक लॉग फ़ाइलों के माध्यम से खोज करने के लिए कष्टप्रद होता है - जो कि अव्यवस्थित हो जाते हैं - अपने लॉग को खोजने के लिए। तो यह उस के लिए एक अच्छा 'त्वरित' समाधान है।
जेरेमी रिम्पो

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

6
+1 धन्यवाद, यह जानने के लिए एक उपयोगी इंटरफ़ेस / वर्ग / प्रकार है - लेकिन यह आपके उत्तर से स्पष्ट नहीं है कि जानकारी कहाँ लॉग की जाएगी और कैसे (यदि संभव हो) उस स्थान को बदलने के लिए।
एलन स्टॉर्म

1
यही सही जवाब है।
मदीना

4
मैं सीधे ObjectManager का उपयोग करने की सलाह नहीं दूंगा। इसके बजाय DI का उपयोग करें
7ochem

12
हालांकि मैं @ 7ochem से सहमत हूं यदि आप एक स्थायी लॉगिंग फ़ंक्शन बना रहे हैं, तो समय-समय पर डिबग मुद्दों के लिए कोर (या थर्ड पार्टी) कक्षाओं में अस्थायी लॉगिंग को इंजेक्ट करना आवश्यक हो सकता है। कंस्ट्रक्टर में एक लकड़हारा वर्ग को जोड़ने की कठिन प्रक्रिया से गुजरना इन मामलों में अति-जटिल है। एक सरल, एकल-पंक्ति डीबग फ़ंक्शन के लिए यह संभवतः सबसे अच्छा समाधान है। हालाँकि, आपको अपने डिबग आउटपुट को खोजने के लिए डिफ़ॉल्ट लॉग फ़ाइलों के माध्यम से खोज करना होगा।
जेरेमी रिम्पो

यह भी ध्यान रखें कि कई कोर कक्षाएं हैं - विशेष रूप से ब्लॉक कक्षाएं - जिनकी एक _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 फ़ाइल में इस कोड का उपयोग करते हैं:

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
वैसे बात यह है कि मोनोलॉग के लिए उपलब्ध सभी हैंडलर लूप किए जाते हैं और पहले जो रिकॉर्ड के स्तर को संभाल सकते हैं (DEBUG, INFO आदि) का उपयोग किया जाता है। तो एक ही तरीका है कि मैं पूरी तरह से सुनिश्चित होऊं कि आपके हैंडलर का उपयोग किया जाता है, आपको इसे ज़रूरत से पहले धक्का देना है, इसलिए इसका स्टैक के शीर्ष पर और पहले लूप में आता है। एक और तरीका यह होगा कि इसे केवल हैंडलर के रूप में सेट करें, अन्य सभी को हटा दें, लेकिन ऐसा करना बहुत अनुकूल बात नहीं होगी।
पितर दझमबाज़ोव

यदि आप 2.0.0 GA में अतिरिक्त हैंडलर शुरू करने की कोशिश करते हैं, या di.xml में हैंडलर निर्दिष्ट करने के साथ काम करते हैं, तो आप इस मुद्दे से अवगत होना चाह सकते हैं github.com/magento/magento2/issues/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

उपयोग और फिर कॉल addDebug()विधि का उपयोग करके अपनी फ़ाइल में psr लकड़हारा वर्ग शामिल करें । यह लॉग संदेश को 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 को नहीं जोड़ सकते क्योंकि यह psr लकड़हारा संगत नहीं है। इसके बजाय बस डिबग का उपयोग करें।
मैकीज पाप्रोकी 15

4

अद्यतन: 19/08/2019

यदि आप सुरुचिपूर्ण कस्टम लॉग हैंडलर की तलाश कर रहे हैं, तो मैं आपको वर्चुअल प्रकार (जिसमें किसी भी PHP कोड को जोड़ने की आवश्यकता नहीं है) का उपयोग करने की सलाह देता हूं

Petar Dzhambazov और halk के जवाब से प्रेरित , महिलाओं और सज्जनों मैंने आपको हर समय डुप्लिकेट किए गए कस्टम लॉग कोड के बजाय एक बेहतर और छोटा तरीका पेश किया।

StackOverflow \ उदाहरण \ आदि \ 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 \ उदाहरण \ आदि \ दृश्यपटल \ 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 के फायदे का उपयोग करें: आभासी प्रकार !!!

उम्मीद है की यह मदद करेगा ;)


3
क्या यह कोड PSI को लागू कर रहा है? (पॉलिटिकल स्टेटमेंट्स इंजेक्शन): पी
iticalochem

1
@ 7ochem ओह हां, यह है: v
गुयेन

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
    यह $ लकड़हारे को तर्क के रूप में पारित करके प्राप्त किया जाता है।

  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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.