Magento 2 में कस्टम लॉग फ़ाइल कैसे बनाएं?


57

मैगनेटो 1 में, विभिन्न फाइलों में सेगमेंट लॉग्स के लिए (भुगतान विधियों के लिए लॉग को अलग करने के लिए, आदि) आम था। के $fileपैरामीटर को बदलना उतना ही आसान है Mage::log

Magento 2 ने मोनोलॉग का उपयोग करने के लिए बदल दिया है।

ऐसा प्रतीत होता है कि मोनोलॉग (या मैगेंटो 2 का कार्यान्वयन) संपूर्ण ढांचे के लिए सभी लॉग को गंभीरता से संभालता है। कुछ हैंडलर हैं जो फाइल करने के लिए लिखते हैं:

\Magento\Framework\Logger\Handler\Debug, \Magento\Framework\Logger\Handler\Exception,\Magento\Framework\Logger\Handler\System

Magento 1 की तरह var / log में संबंधित फाइलों में लॉग इन करना

मैं एक विशेष गंभीरता (IE, नोटिस लिख सकता हूं) के लिए एक हैंडलर जोड़ सकता हूं var/log/notice.log\Magento\Framework\Logger\Handler\Baseहैंडलर को बढ़ाएं और पंजीकृत करें di.xml

यह आलेख मोटे तौर पर उस प्रक्रिया का वर्णन करता है: http://semaphoresoftware.kinja.com/how-to-create-a-custom-log-in-magento-2-1704130912

लेकिन मैं अपनी पसंद की फ़ाइल के लिए एक वर्ग (सभी Magento के नहीं) के लिए सभी लॉग (न केवल एक गंभीरता) लिखने के बारे में कैसे जा सकता हूं?

ऐसा लगता है कि मुझे अपना खुद का संस्करण बनाना होगा Magento\Framework\Logger\Monolog, लेकिन फिर वास्तव में काम करने के लिए सब कुछ एक साथ कैसे फिट होता है?

यदि यह Magento 2 में एक बड़ा नहीं-नहीं है, तो विकल्प क्या है? मैं क्लाइंट साइटों पर आवश्यक होने पर इसे डीबग करने के उद्देश्य से इस एक्सटेंशन के लिए लॉग को अलग करना चाहता हूं। सिस्टम.लॉग, अपवाद.लॉग इत्यादि को लिखी गई जानकारी होने और हर दूसरे मॉड्यूल के लॉग के साथ जंबल्ड व्यावहारिक नहीं है।

जवाबों:


99

आपको Magento2 के लॉगिंग को अनुकूलित करने या विस्तारित करने की आवश्यकता नहीं है। जैसा कि आपने कहा कि यह केवल मामूली अनुकूलन के साथ मोनोलॉग का उपयोग कर रहा है। यह बहुत कम प्रयास के साथ मोनोलॉग का विस्तार करने वाले अपने लकड़हारे को लिखने के लिए पर्याप्त है।

मान लें कि आपका मॉड्यूल इसमें है YourNamespace/YourModule:

1) लकड़हारा वर्ग लिखें Logger/Logger.php:

<?php
namespace YourNamespace\YourModule\Logger;

class Logger extends \Monolog\Logger
{
}

2) हैंडलर क्लास इन लिखें Logger/Handler.php:

<?php
namespace YourNamespace\YourModule\Logger;

use Monolog\Logger;

class Handler extends \Magento\Framework\Logger\Handler\Base
{
    /**
     * Logging level
     * @var int
     */
    protected $loggerType = Logger::INFO;

    /**
     * File name
     * @var string
     */
    protected $fileName = '/var/log/myfilename.log';
}

नोट: यह एकमात्र चरण है जो Magento कोड का उपयोग करता है। \Magento\Framework\Logger\Handler\Baseमोनोलॉग का विस्तार करता है StreamHandlerऔर उदाहरण के लिए Magento बेस पथ के साथ $ फ़ाइलनाम विशेषता को प्रस्तुत करता है।

3) निर्भरता इंजेक्शन में रजिस्टर लकड़हारा etc/di.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <type name="YourNamespace\YourModule\Logger\Handler">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="YourNamespace\YourModule\Logger\Logger">
        <arguments>
            <argument name="name" xsi:type="string">myLoggerName</argument>
            <argument name="handlers"  xsi:type="array">
                <item name="system" xsi:type="object">YourNamespace\YourModule\Logger\Handler</item>
            </argument>
        </arguments>
    </type>
</config>

नोट: यह कड़ाई से आवश्यक नहीं है लेकिन DI को कंस्ट्रक्टर के लिए विशिष्ट तर्क पारित करने की अनुमति देता है। यदि आप यह कदम नहीं करते हैं, तो आपको हैंडलर सेट करने के लिए कंस्ट्रक्टर को समायोजित करने की आवश्यकता है।

4) अपने Magento वर्गों में लकड़हारे का उपयोग करें:

यह डिपेंडेंसी इंजेक्शन द्वारा किया जाता है। नीचे आपको एक डमी क्लास मिलेगी जो केवल एक लॉग प्रविष्टि लिखती है:

<?php
namespace YourNamespace\YourModule\Model;

class MyModel
{
    /**
     * Logging instance
     * @var \YourNamespace\YourModule\Logger\Logger
     */
    protected $_logger;

    /**
     * Constructor
     * @param \YourNamespace\YourModule\Logger\Logger $logger
     */
    public function __construct(
        \YourNamespace\YourModule\Logger\Logger $logger
    ) {
        $this->_logger = $logger;
    }

    public function doSomething()
    {
        $this->_logger->info('I did something');
    }
}

2
मैं दूसरे दिन आर्किटेक्ट में से एक के समान कुछ पूछ रहा था, इसलिए इस उदाहरण के लिए धन्यवाद! मैं वर्ग के नाम के आधार पर समर्थन जोड़ने के बारे में सोच रहा था ताकि डीआई फ्रेमवर्क विभिन्न वर्गों के लिए "सही" लकड़हारा को इंजेक्ट कर सके, और इस तरह के कोड परिवर्तन के बिना झंडे को चालू / बंद करने के लिए व्यवस्थापक में स्विच हो। इस प्रकार की कार्यक्षमता लोगों के लिए कितनी उपयोगी होगी?
एलन केंट

1
मनोज, यदि आप जिस टेम्पलेट का उल्लेख कर रहे हैं, उसमें लकड़हारा के साथ एक ब्लॉक क्लास है तो आप एक सार्वजनिक विधि लिख सकते हैं जो तब संदेश को लकड़हारे के पास भेज देता है। के बाद से _logger सुरक्षित है आपका उदाहरण अभ्यस्त काम करता है, तो यह सब पर मौजूद है
Halk

3
मेरी राय में, वर्तमान दृष्टिकोण एम 1 के पास से एक कदम पीछे है। लॉगिंग एक डेवलपर टूल भी होना चाहिए, यह केवल एक लाइव एप्लिकेशन की निगरानी के लिए नहीं है। मैं देख सकता हूं कि मौजूदा कार्यान्वयन को ओवरराइड करने और फिर उत्पादन उपयोग के लिए प्रतिस्थापित करने के लिए एक वैकल्पिक बहुउद्देश्यीय सरलीकृत पुस्तकालय का उपयोग कैसे किया जा सकता है
बारबज़ुल

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

2
मेरे लिए यह हमेशा /var/log/system.log ले रहा है, किसी भी विचार क्यों?
मगेप्सिचिको

20

हम फाइल को इस तरह से लॉग इन कर सकते हैं।

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/templog.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);

$logger->info("Info". $product->getSku() . "----- Id  ". $product->getId() );
$logger->info("preorder qty ". $product->getPreorderQty());

2
यह त्वरित और आसान है
PMB

9

सबसे सरल संभव तरीका:

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

6

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

मान लें कि आपका मॉड्यूल अंदर है MyNamespace/MyModuleऔर वर्ग, जिसे आप एक कस्टम फ़ाइल में लॉग इन करना चाहते हैं, कहा जाता है MyClass। यदि कक्षा का निर्माता पहले से ही \Psr\Log\LoggerInterfaceचरण 2 पर छोड़ देता है)। अन्यथा आपको इसे निर्माता में इंजेक्ट करने की आवश्यकता है:

1) अपनी कक्षा में LoggerInterface इंजेक्ट करें MyClass.php:

<?php

namespace MyNamespace\MyModule;

use Psr\Log\LoggerInterface;

class MyClass
{
    /**
     * @var \Psr\Log\LoggerInterface
     */
    protected $logger;

    public function __construct(
        LoggerInterface $logger
    ) {
        $this->logger = $logger;
    }
}

यदि आप एक वर्ग का विस्तार करते हैं, जिसमें पहले से ही एक लकड़हारा (जैसे \Magento\Framework\App\Helper\AbstractHelper) शामिल है, तो आप $_loggerअलग सदस्य का उपयोग करने के बजाय उस सदस्य (आमतौर पर ) को अधिलेखित कर सकते हैं । बस मूल निर्माता के निर्देश के $this->_logger = $logger बाद जोड़ें ।

<?php

namespace MyNamespace\MyModule;

use Magento\Framework\App\Helper\Context;
use Psr\Log\LoggerInterface;

class MyClass extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function __construct(
        Context $context,
        LoggerInterface $logger
    ) {
        parent::__construct(
            $context
        );

        $this->_logger = $logger;
    }
}

2) निर्भरता इंजेक्शन के माध्यम से लकड़हारा कॉन्फ़िगर करें etc/di.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="MyNamespace\MyModule\Logger\Handler" type="Magento\Framework\Logger\Handler\Base">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
            <argument name="fileName" xsi:type="string">/var/log/mymodule.log</argument>
        </arguments>
    </virtualType>
    <virtualType name="MyNamespace\MyModule\Logger\Logger" type="Magento\Framework\Logger\Monolog">
        <arguments>
            <argument name="name" xsi:type="string">MyModule Logger</argument>
            <argument name="handlers" xsi:type="array">
                <item name="system" xsi:type="object">MyNamespace\MyModule\Logger\Handler</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="MyNamespace\MyModule\MyClass">
        <arguments>
            <argument name="logger" xsi:type="object">MyNamespace\MyModule\Logger\Logger</argument>
        </arguments>
    </type>
</config>

यह सब कुछ लॉग इन करेगा /var/log/mymodule.log

यदि आपको एक अलग वर्ग के लिए एक अलग फ़ाइल में लॉग इन करने की आवश्यकता है, तो आप बस एक और वर्चुअल हैंडलर के साथ एक और वर्चुअल लॉगर बना सकते हैं और इसे उस कक्षा में इंजेक्ट कर सकते हैं।


5

यदि आपको केवल अपने एकल वर्ग में इसकी आवश्यकता है:

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

pushHandler इंटरफ़ेस पर उजागर नहीं किया गया है और कार्यान्वयन कार्य नहीं करता है ...
जॉर्ज जॉर्ज

आपका Magento संस्करण?
मुशकिल

Magento CE 2.2.0
जॉर्ज

मैं इसे सीई 2.2.0 पर आजमाऊंगा और आपके पास वापस आऊंगा। मैंने इसका इस्तेमाल 2.1
mshakeel

2

" Praxigento / mage2_ext_log " मॉड्यूल आज़माएं । यह मॉड्यूल Magento 2 के लिए "मोनोलॉग कैस्केड" समर्थन जोड़ता है। "मोनोलॉग कैस्केड" आपको एकल कॉन्फ़िगरेशन फ़ाइल के साथ लॉगिंग आउटपुट को कॉन्फ़िगर करने की अनुमति देता है। आप अपने लॉग को विभिन्न फाइलों, डेटाबेसों, ईमेल अलर्टों और अपने स्वयं के कोड के संशोधनों के बिना प्रिंट कर सकते हैं।

यह कॉन्फ़िगरेशन फ़ाइल का एक नमूना है (डिफ़ॉल्ट रूप से 'var / log / logging.yaml'):

disable_existing_loggers: true
formatters:
    dashed:
        class: Monolog\Formatter\LineFormatter
        format: "%datetime%-%channel%.%level_name% - %message%\n"
handlers:
    debug:
        class: Monolog\Handler\StreamHandler
        level: DEBUG
        formatter: dashed
        stream: /.../var/log/cascade_debug.log
    system:
        class: Monolog\Handler\StreamHandler
        level: INFO
        formatter: dashed
        stream: /.../var/log/cascade_system.log
    exception:
        class: Monolog\Handler\StreamHandler
        level: EMERGENCY
        formatter: dashed
        stream: /.../log/cascade_exception.log
processors:
    web_processor:
        class: Monolog\Processor\WebProcessor
loggers:
    main:
        handlers: [debug, system, exception]
        processors: [web_processor]

1

यदि कोई तर्क परिवर्तन नहीं है और केवल एक कस्टम लॉग फ़ाइल नाम बदलने की आवश्यकता है, तो कस्टम लकड़हारा वर्ग बनाने की भी आवश्यकता नहीं है, बस चरणों का पालन करें

1. di.xml में

 <type name="Magento\Framework\Logger\Monolog">
        <arguments>
            <argument name="name" xsi:type="string">test</argument>
            <argument name="handlers"  xsi:type="array">
                <item name="test" xsi:type="object">NAME_SPACE\Test\Model\Logger\Handler\Debug</item>
            </argument>
        </arguments>
    </type>

2. हैंडलर

<?php
/**
 * Copyright © 2017 Alshaya, LLC. All rights reserved.
 * See LICENSE.txt for license details.
 *
 */
namespace NAME_SPACE\Test\Model\Logger\Handler;

use Magento\Framework\Logger\Handler\Base;

/**
 * Log handler for reports
 */
class Debug extends Base
{
    /**
     * @var string
     */
    protected $fileName = '/var/log/test.log';
}

जहां कभी भी आपको उस डेटा को लॉग इन करने की आवश्यकता होती है जिसे आपको डिफ़ॉल्ट PSR लॉग को कॉल करने की आवश्यकता होती
है

<?php
/**
 *
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace NAME_SPACE\Test\Controller\Index;

use Psr\Log\LoggerInterface;
class Index extends \Magento\Framework\App\Action\Action
{


    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * Show Contact Us page
     *
     * @return void
     */


    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        LoggerInterface $logger
    ) {
        parent::__construct($context);
        $this->logger = $logger;
    }


    public function execute()
    {
        $this->logger->critical((string) 'Test');
        $this->_view->loadLayout();
        $this->_view->renderLayout();
    }
}

उदाहरण के लिए उपर्युक्त सभी डिबग डेटा को टेस्ट में लॉग करेगा। यदि आपको सिस्टम बदलने की आवश्यकता है तो आप di.xml में नीचे की पंक्ति जोड़ सकते हैं


0

मैंने एक थर्ड पार्टी मॉड्यूल में जहां मैं लॉग इन की जानकारी प्राप्त करना चाहता हूं और उन्हें custom.log फ़ाइल में प्राप्त करना चाहता हूं, वहां मैंने नीचे दिए गए लॉगर ऑब्जेक्ट कोड की कोशिश की, इस कोड की जांच करें, आपको निश्चित रूप से आपके कस्टम लॉग फ़ाइल में लॉग मिलते हैं।

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/custom.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info('Your log details: ' .$variable);

यदि आपको यहां अधिक जानकारी की आवश्यकता है, तो मैं जवाब दूंगा। धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.