ম্যাজেন্টো 2: ম্যাগের জন্য প্রতিস্থাপন :: লগ পদ্ধতি?


105

ম্যাজেন্টো 1-এ, আপনি লগগুলিতে কোনও বার্তা প্রেরণ করতে চাইলে আপনি বিশ্বব্যাপী Mageক্লাসে একটি স্ট্যাটিক পদ্ধতি ব্যবহার করতেন ।

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

ম্যাজেন্টো 2 তে কি সমমান আছে? আমি ডেভ ডক্স সাইটের মাধ্যমে গুগল করেছি এবং এমন কোনও স্পষ্ট দেখতে পাইনি যা পপ আউট হয়ে যায়। আছে এই Inchoo নিবন্ধ, কিন্তু এটা প্রায় এক বছর আগে থেকে এবং আরও অনেক তারপর থেকে পরিবর্তিত হয়েছে।

একটি ম্যাজেন্টো 2 মডিউল বিকাশকারী হিসাবে, যদি আমি ম্যাজেন্টো 1-তে নীচের মতো কোডটি প্রতিস্থাপন করতে চাই

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

আমার খালি ন্যূনতম কি করা উচিত?

উত্তর:


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

আপনি পিএসআর লগারের জন্য ডিবাগ, ব্যতিক্রম, সিস্টেম ব্যবহার করেন:

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

9
+1 আপনাকে ধন্যবাদ, এটি জানার জন্য একটি দরকারী ইন্টারফেস / শ্রেণি / প্রকার - তবে তথ্যটি কোথায় লগ ইন করা হবে এবং কীভাবে (যদি সম্ভব হয়) সেই অবস্থান পরিবর্তন করতে পারে তবে আপনার উত্তর থেকে তা পরিষ্কার নয়।
অ্যালান ঝড়

আপনি নিম্নলিখিত ক্লাসে ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ ইভেন্টের জন্য ম্যানেজার.এফপি চেক করুন এবং এই লাইনটি যুক্ত করুন - এটি-> লগার-> ডিবাগ ($ ইভেন্টের নাম); পৃষ্ঠাটি রিফ্রেশ করার পরে এবং ডিবাগ.টেক্সট ফাইলটি পরীক্ষা করে সুনির্দিষ্ট পৃষ্ঠার জন্য সমস্ত খোলামেলা নাম পান।
প্রতীক

2
প্রযুক্তিগতভাবে, আপনার নিজস্ব কাস্টম ক্লাসগুলিতে কোনও লগার ইনস্ট্যান্ট করার জন্য এটি 'সঠিক' উপায় particularly বিশেষত যদি আপনি কেবল কিছু দ্রুত ডিবাগের পরিবর্তে এটি প্রায় রাখার মনস্থ করেন। তবে, বেশ কয়েকটি মূল শ্রেণি রয়েছে - বিশেষত ব্লক ক্লাস - যা স্বয়ংক্রিয়ভাবে ইনস্টল করে একটি লগার সম্পত্তি সংরক্ষণ করে। আপনি যদি এই মূল শ্রেণীর একটি প্রসারিত করেন তবে যুক্তির পুনরাবৃত্তি করার দরকার নেই। অন্যান্য উত্তরগুলি আপনার নিজস্ব লগ ফাইলটি সংজ্ঞায়িত করতে হ্যান্ডলারগুলি তৈরি করতে খনন করে, তবে ডিফল্ট লগগুলি সর্বদা /var/log/system.log বা /var/log/debug.log হয়। আমি বিশ্বাস করি যে নির্দিষ্ট লগিং ফাংশনটি ব্যবহৃত হয় তা নির্ধারণ করে।
জেরেমি রিম্পো

7
আমার জন্য, "ডিবাগ" স্তরটি তখনই কাজ করা শুরু করে যখন আমি কনফিগারেশন> উন্নত> বিকাশকারী> ডিবাগে "ফাইলটিতে লগ ইন করুন" সক্ষম করেছিলাম। 2.2
ওমার সাবিক

121

ম্যাজেন্টো 2-তে, আপনি 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');

সম্পাদিত

আপনি নীচের মতো পিএইচপি অবজেক্ট এবং অ্যারে মুদ্রণ করতে পারেন:

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

7
+1 দরকারী - আপনি জানেন কী জেন্ড লগার স্বয়ংক্রিয়ভাবে পিএইচপি অ্যারে / অবজেক্টস ইত্যাদি বিন্যাস করবে?
অ্যালান ঝড়

1
@ অ্যালানস্টর্ম - হ্যাঁ আপনি করতে পারেন, আমার আপডেট হওয়া উত্তরটি পরীক্ষা করুন!
মানশভী বিড়লা

2
@ মনশবিবীরলা: PHP objectsছাপা হচ্ছে না ...
জেড ব্ল্যাকবের্ড

1
@ কেয়ারশাহ উবুন্টুকে মাথায় রেখেই সমাধানটি সরবরাহ করা হয়েছিল, যেহেতু আমি উবুন্টু ব্যবহার করছিলাম! প্রতিক্রিয়াটির জন্য ধন্যবাদ
মানশভী বিড়লা

3
এই উত্তরগুলির বেশ কয়েকটিগুলির স্থান এবং ব্যবহার রয়েছে। স্পষ্টতই এই সমাধানটির জন্য স্ট্যান্ডার্ড লগারটি ইনস্ট্যান্ট করতে ডিআই ব্যবহার করার মতো প্রায় কোডের দরকার হয় - তবে এটি একটি সহজ জায়গা-এ থাকা ড্রপ-ইন যা আপনাকে আপনার নিজের লগ ফাইল সেট করতে দেয়। কখনও কখনও এটি স্ট্যান্ডার্ড লগ ফাইলগুলি অনুসন্ধান করার পরিবর্তে বিরক্তিকর হয় - যা আপনার নিজের লগগুলি সন্ধান করার জন্য বিশৃঙ্খল হয়ে পড়ে। সুতরাং এটির জন্য এটি একটি দুর্দান্ত 'দ্রুত' সমাধান।
জেরেমি রিম্পো

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

6
+1 আপনাকে ধন্যবাদ, এটি জানার জন্য একটি দরকারী ইন্টারফেস / শ্রেণি / প্রকার - তবে তথ্যটি কোথায় লগ ইন করা হবে এবং কীভাবে (যদি সম্ভব হয়) সেই অবস্থান পরিবর্তন করতে পারে তবে আপনার উত্তর থেকে তা পরিষ্কার নয়।
অ্যালান ঝড়

1
এটাই সঠিক উত্তর।
মদিনা

4
আমি সরাসরি অবজেক্টম্যানেজারটি ব্যবহার করার পরামর্শ দেব না। পরিবর্তে ডিআই ব্যবহার করুন
ইচেম্বর

12
আমি যদি আপনি একটি স্থায়ী লগিং ফাংশন তৈরি করে থাকি তবে @ 7 ওচেমের সাথে আমি একমত হই, ইস্যুগুলি ডিবাগ করার জন্য সময়ে সময়ে কোর (বা তৃতীয় পক্ষ) শ্রেণিতে অস্থায়ী লগিং ইনজেকশন করা প্রয়োজন। কনস্ট্রাক্টরে একটি লগার ক্লাস যুক্ত করার কঠোর প্রক্রিয়াটি অবলম্বন করা এই ক্ষেত্রে অর্থহীনভাবে অতিরিক্ত জটিল। একটি সাধারণ, একক-লাইন ডিবাগ ফাংশনের জন্য এটি সম্ভবত সেরা সমাধান। তবে, আপনার নিজের ডিবাগ আউটপুট সন্ধান করতে আপনাকে ডিফল্ট লগ ফাইলগুলির মাধ্যমে অনুসন্ধান করতে হবে।
জেরেমি রিম্পো

এছাড়াও মনে রাখবেন যে এখানে বেশ কয়েকটি মূল ক্লাস রয়েছে - বিশেষত ব্লক ক্লাস - যার একটি লগারের সম্পত্তি রয়েছে যা আপনি কোনও নতুন অনুলিপি ইনস্ট্যান্ট না করে অ্যাক্সেস করতে পারবেন।
জেরেমি রিম্পো

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 \ লগিন \ 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));

}

অথবা আপনি এই কোডটি সরাসরি পিএইচটিএমএল ফাইলে ব্যবহার করুন:

ডিবাগ.লগে স্ট্রিং আউটপুট প্রিন্ট করতে

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

সুবিধামত আইএমওতে এক ধাপ পিছনে


+1 দরকারী তথ্য, আপনাকে ধন্যবাদ! তবে, আপনি কীভাবে পিএসআর -3 অটোলোডার ইন্টারফেসের সাথে এই লগার প্রসঙ্গটি ব্যবহার করবেন তা পরিষ্কার নয় - যেমন আপনি লগইন করছেন $this->logger->info($message, $level);- আপনি কীভাবে "আমার প্রসঙ্গটি ব্যবহার করবেন"?
অ্যালান ঝড়

2
ভাল কথাটি হ'ল মনোলোলের কাছে উপলব্ধ সমস্ত হ্যান্ডলারগুলি লুপ হয়ে গেছে এবং যা রেকর্ডের স্তরের (DEBUG, INFO ইত্যাদি) পরিচালনা করতে পারে তা ব্যবহৃত হয়। সুতরাং আপনার হ্যান্ডলারটি ব্যবহৃত হয়েছে কিনা তা নিশ্চিত হওয়ার একমাত্র উপায় হ'ল এটির প্রয়োজনের আগে এটি ধাক্কা দেওয়া, সুতরাং এটি স্ট্যাকের শীর্ষে এবং লুপে প্রথমে আসে। অন্য উপায় হ'ল হ্যান্ডলার হিসাবে কেবল সেট করা, অন্য সকলকে সরিয়ে ফেলা, তবে এটি করা খুব বন্ধুত্বপূর্ণ জিনিস হবে না।
পেটার ঝাজাবাজভ

আপনি এই সমস্যা সচেতন হতে চাইতে পারেন আপনি 2.0.0 জি অতিরিক্ত হ্যান্ডেলার পরিচয় করিয়ে, অথবা di.xml মধ্যে হ্যান্ডেলার উল্লেখ সঙ্গে কাজ করার চেষ্টা করুন github.com/magento/magento2/issues/2529 আমি চেষ্টা এই সমস্যাটি গাড়ীতে আঘাত একটি কাস্টম লগ পাওয়ার জন্য একটি কাস্টম লগ ফাইল হ্যান্ডেল এবং একটি কাস্টম হ্যান্ডলার যা কোনও ডাটাবেস সারণিতে কিছু এন্ট্রি লিখেছে।
mtjohnson

9

একটি সহজ উপায়ে যদি আপনি নির্ভরতা ইনজেকশন তৈরি করতে না চান বা কোডের নীচে অন্য কোনও কিছু ব্যবহার করতে চান তবে এটি system.logফাইলটিতে লগইন করবে

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

এখানেই শেষ..


5

না, সরাসরি কোনও সমতুল্য নেই। এটি এখন কিছুটা জটিল।

দেখুন: ম্যাজেন্টো 2 এ একটি কাস্টম ফাইলে লগইন করা হচ্ছে


1
+1, আপনাকে ধন্যবাদ! তবে - অন্যান্য উত্তরগুলি এটিকে শোনায় যে কোনও একক লগর থাকতে পারে এবং প্রসারিত / হ্যান্ডেল পদ্ধতির তৈরি করার প্রয়োজন নেই। সত্য যদি তা জানেন?
অ্যালান ঝড়

4

ব্যবহার এবং তারপরে কল addDebug()পদ্ধতিটি ব্যবহার করে আপনার ফাইলে পিএসআর লগার ক্লাস অন্তর্ভুক্ত করুন । এটি 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
আপনার অ্যাডডিবগ উজসে করা উচিত নয় কারণ এটি পিএসআর লগার সামঞ্জস্যপূর্ণ নয়। পরিবর্তে কেবল ডিবাগ ব্যবহার করুন।
ম্যাকিয়েজ পাপ্রোকি

4

আপডেট হয়েছে: 19/08/2019

যদি আপনি মার্জিত কাস্টম লগ হ্যান্ডলার সন্ধান করে থাকেন তবে আমি আপনাকে ভার্চুয়াল প্রকার (যা কোনও পিএইচপি কোড যুক্ত করার দরকার নেই) ব্যবহার করার পরামর্শ দিচ্ছি

পেটর জাম্বাজভ এবং হাল্কের উত্তর থেকে অনুপ্রাণিত হয়ে , মহিলা ও ভদ্রলোক আমি আপনাকে সর্বদা ডুপ্লিকেটযুক্ত কাস্টম লগ কোডের পরিবর্তে একটি আরও ভাল এবং খাটো উপায়ের সাথে পরিচয় করিয়ে দিয়েছি।

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>

, USAGE

বিক্রেতার \ কিছু \ মডেল \ 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>

এগুলি সবই, কোনও অতিরিক্ত পিএইচপি ফাইল বা লাইন নেই - ম্যাজেন্টো 2: ভার্চুয়াল প্রকারের সুবিধাগুলি ব্যবহার করুন !!!

আশাকরি এটা সাহায্য করবে ;)


3
এই কোডটি কি পিএসআই বাস্তবায়ন করছে? (রাজনৈতিক বিবৃতি ইনজেকশন): পি
ওচেম 12'17

1
@ 7ochem ওহ হ্যাঁ, এটি হল: V
Toan গুয়েন

2

২.২ এ লগারের জন্য একটি আপডেট রয়েছে। আপনি চালিত এসকিউএল দ্বারা উত্পাদন মোডের জন্য লগার সক্ষম করতে পারেন:

 "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 এসকিউএল এর পরিবর্তেও ব্যবহার করতে পারেন: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.
ফুডু

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

আপনার কনস্ট্রাক্টরে পিএসআর লগার কোড রাখুন:

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

তারপরে আপনি আপনার ফাংশনে যেমন ব্যবহার করতে পারেন:

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