ম্যাজেন্টো 2 এ কীভাবে কাস্টম লগ ফাইল তৈরি করবেন?


57

ম্যাজেন্টো 1-এ, বিভিন্ন ফাইলগুলিতে লগগুলি ভাগ করার পক্ষে (অর্থ প্রদানের পদ্ধতিগুলির জন্য পৃথক লগগুলি ইত্যাদির জন্য) সাধারণ ছিল। এটি $fileপ্যারামিটার পরিবর্তন করার মতোই সহজ Mage::log

ম্যাজেন্টো 2 মনোলোল ব্যবহার করতে পরিবর্তিত হয়েছে।

এটি প্রদর্শিত হয় যে মনোোলজ (বা এটি ম্যাগনটো 2 এর প্রয়োগ) তীব্রতার দ্বারা হ্যান্ডলারের পুরো কাঠামোর জন্য সমস্ত লগকে ভাগ করে দেয়। এমন কয়েকটি হ্যান্ডলার রয়েছে যা ফাইল করতে লিখেছে:

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

ম্যাজেন্টো 1 তে ভার / লগতে সংশ্লিষ্ট ফাইলগুলিতে লগইন করা হচ্ছে।

আমি একটি নির্দিষ্ট তীব্রতার জন্য হ্যান্ডলার যুক্ত করতে পারি (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\Framework\Logger\Monologতবে তারপরে কীভাবে সমস্ত কিছু একসাথে খাপ খায়?

এটি যদি ম্যাজেন্টো 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\Framework\Logger\Handler\Baseমনোলোজের প্রসারিত হয় StreamHandlerএবং উদাহরণস্বরূপ age ফাইলনাম বৈশিষ্ট্যটি ম্যাজেন্টো বেস পাথের সাথে প্রেরণ করে।

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>

দ্রষ্টব্য: এটি কঠোরভাবে প্রয়োজন হয় না তবে ডিআই কে নির্মাতার কাছে নির্দিষ্ট যুক্তিগুলি সরবরাহ করার অনুমতি দেয়। আপনি যদি এই পদক্ষেপটি না করেন তবে হ্যান্ডলারটি সেট করতে আপনার কনস্ট্রাক্টরকে সামঞ্জস্য করতে হবে।

4) আপনার ম্যাজেন্টো ক্লাসে লগারটি ব্যবহার করুন:

এটি নির্ভরতা ইনজেকশন দ্বারা সম্পন্ন হয়। নীচে আপনি একটি ডামি ক্লাস পাবেন যা কেবল একটি লগ এন্ট্রি লিখেছে:

<?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
@ অ্যালানকেন্ট আমি এখানে বারবাজুলের সাথে একমত - আপনি যে কোনও ফাইলটিতে সহজেই লগ ইন করার ক্ষমতাটি এম 1-তে দ্রুত স্তরটি উল্লেখ করে দুর্দান্ত। এটি এতটা নমনীয় (গতিশীল) নয় যা লজ্জাজনক। ডিফল্ট লগার কলগুলির পরামিতি হিসাবে ফাইলের নামটি রাখা ভাল। উত্তর থামার জন্য ধন্যবাদ!
রবি অ্যাভারিল 21

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


6

হাল্ক এবং প্রদীপ কুমারের উত্তর ছাড়াও: যদি সত্যিই আপনার একমাত্র উদ্বেগ অন্য কোনও ফাইলে লগইন করা হয় তবে কিছুটা সহজ উপায় আছে। বিশেষত যদি আপনি এটি একাধিক মডিউলে অন্তর্ভুক্ত করতে চান বা যদি আপনার মডিউলটির মধ্যে বিভিন্ন লগ ফাইল চান। এই পদ্ধতির সাহায্যে আপনার কাস্টম হ্যান্ডলার তৈরি করতে হবে না।

আপনার মডিউলটি ধরে আছে MyNamespace/MyModuleএবং ধরে নেওয়া হচ্ছে যে ক্লাসটি, আপনি একটি কাস্টম ফাইলে লগ করতে চান, তাকে ডাকা হয় MyClass। যদি শ্রেণীর নির্মাতা ইতিমধ্যে \Psr\Log\LoggerInterface2 টি পদক্ষেপ এড়িয়ে যান। অন্যথায় আপনার এটি নির্মাণে ইঞ্জেকশন করা দরকার:

1) আপনার শ্রেণিতে লগার ইন্টারফেস ইনজেক্ট করুন 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'));
}

ইন্টারফেসে পুশহ্যান্ডলারের উদ্ভাসিত পদ্ধতিটি প্রকাশিত হয়নি এবং প্রয়োগটি কার্যকর হবে বলে মনে হচ্ছে না ...
জর্জ

আপনার ম্যাজেন্টো সংস্করণ?
মিশেল

ম্যাজেন্টো সিই 2.2.0
জর্জ

আমি এটি সিই ২.২.০ এ চেষ্টা করব এবং আপনার কাছে ফিরে আসব। আমি এটি ২.১
মিশকেল

2

" Praxigento / mage2_ext_logging " মডিউল চেষ্টা করুন । এই মডিউলটি "মনোলোজ ক্যাসকেড" সমর্থন ম্যাগন্তো ২-এ যোগ করেছে "" মনোলোগ ক্যাসকেড "আপনাকে একক কনফিগারেশন ফাইলের সাহায্যে লগিং আউটপুট কনফিগার করতে দেয়। আপনি নিজের লগগুলি নিজের কোড পরিবর্তন না করে বিভিন্ন ফাইল, ডাটাবেসগুলিতে ইমেল সতর্কতা এবং ইত্যাদি প্রেরণ করতে পারেন।

এটি কনফিগারেশন ফাইলের একটি নমুনা (ডিফল্টরূপে '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';
}

যেখানে আপনাকে ডেটা লগ করার দরকার ছিল সেটিকে ডিফল্ট পিএসআর লগকে কল
করতে হবে

<?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

আমি নীচে লগার অবজেক্ট কোডটি তৃতীয় পক্ষের মডিউলটিতে চেষ্টা করেছি যেখানে আমি সেখানে রেখেছি লগের তথ্য পেতে এবং সেগুলি কাস্টম.লগ ফাইলটিতে পেতে চাই, এই কোডটি পরীক্ষা করুন, আপনি অবশ্যই নিজের কাস্টম লগ ফাইলে লগগুলি পান।

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

আপনার যদি এখানে আরও তথ্যের মন্তব্য প্রয়োজন হয়, আমি প্রতিক্রিয়া জানাব। ধন্যবাদ.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.