Magento 2:Mage :: logメソッドの置換?


105

Magento 1では、メッセージをログに送信する場合、グローバルMageクラスで静的メソッドを使用します。

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

Magento 2に同等のものはありますか?私はdev docsサイトをグーグルで検索しましたが、明らかなものは見当たりません。あります。この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 Loggerのデバッグ、例外、システムを使用します。

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

9
+1ありがとう、それは知っておくと便利なインターフェイス/クラス/タイプですが、答えがどこに記録されるか、その場所を変更する方法(可能な場合)は明確ではありません。
アランストーム

次のクラスMagento \ Framework \ EventのManager.phpを確認し、次の行を追加します$ this-> logger-> debug($ eventName); ページを更新してdebug.txtファイルを確認した後、特定のページのすべてのエバント名を取得します。
プラティック

2
技術的には、これは独自のカスタムクラスでロガーをインスタンス化するための「正しい」方法です-特に、ちょっとしたデバッグではなく、保持するつもりの場合。ただし、_loggerプロパティを自動的にインスタンス化して保存するいくつかのコアクラス(特にブロッククラス)があります。これらのコアクラスのいずれかを拡張する場合、ロジックを繰り返す必要はありません。他の回答では、ハンドラーを作成して独自のログファイルを定義しますが、デフォルトのログは常に/var/log/system.logまたは/var/log/debug.logです。特定のロギング機能により、どちらが使用されるかが決まります。
ジェレミーリンポ

7
私にとって、「デバッグ」レベルは、「構成」>「詳細」>「開発者」>「デバッグ」で「ファイルにログ」を有効にした場合にのみ機能し始めました。2.2を使用
Omer Sabic

122

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
@Manashvibirla:PHP objects印刷されていません...
黒ひげZED

1
@KeyurShah私はubuntuを使用していたので、ubuntuを念頭に置いてソリューションを提供しました。フィードバックをありがとう
Manashvi Birla

3
これらの回答のいくつかには、それぞれの場所と用途があります。明らかに、このソリューションは、DIを使用して標準ロガーをインスタンス化するのとほぼ同じ量のコードを必要としますが、独自のログファイルを設定できる単純なインプレースドロップインです。ときどき、標準のログファイル(散らかる傾向がある)を検索して、独自のログを見つけるのはかなり面倒です。したがって、これはそのための素晴らしい「クイック」ソリューションです。
ジェレミーリンポ

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

6
+1ありがとう、それは知っておくと便利なインターフェイス/クラス/タイプですが、答えがどこに記録されるか、その場所を変更する方法(可能な場合)は明確ではありません。
アランストーム

1
それが正しい答えです。
メディナ

4
ObjectManagerを直接使用することはお勧めしません。代わりにDIを使用してください
-7ochem

12
永続的なログ機能を作成する場合、@ 7ochemに同意しますが、問題をデバッグするためにコア(またはサードパーティ)クラスに一時的なログを挿入する必要がある場合があります。これらの場合、Loggerクラスをコンストラクタに追加するという骨の折れるプロセスを通過することは、無意味に過度に複雑になります。シンプルな単一行のデバッグ機能の場合、これがおそらく最良のソリューションです。ただし、デフォルトのログファイルを検索して、独自のデバッグ出力を見つける必要があります。
ジェレミーリンポ

また、いくつかのコアクラス(特にブロッククラス)があることに注意してください。これらのクラスには、新しいコピーをインスタンス化せずにアクセスできる_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
それは、Monologで使用できるすべてのハンドラーがループされ、最初にレコードのレベル(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');

それで全部です..



4

use使用してファイルにpsrロガークラスを含めてから、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
addDebugはpsrロガーと互換性がないため、ujseを使用しないでください。代わりにデバッグのみを使用してください。
Maciej Paprocki

4

更新済み:19/08/2019

エレガントなカスタムログハンドラーを探している場合は、仮想タイプを使用することをお勧めします(PHPコードを追加する必要はありません)

Petar Dzhambazovhalk、ご列席の皆様の回答からインスピレーションを得て、カスタムログコードを常に複製する代わりに、より良い、より短い方法を紹介しました。

StackOverflow \ Example \ etc \ 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>

使用法

Vendor \ Something \ 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 \ Example \ etc \ frontend \ di.xml

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

PHPファイルや行を追加する必要はありません。Magento2:Virtual Typesの利点を活用してください!!!

お役に立てれば ;)


3
このコードはPSIを実装していますか?(政治声明の注入):P
7ochem

1
@ 7ochemああ、そうです:v
Toan Nguyen

2

2.2にはロガーの更新が1つあります。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));
}

おかげで、クエリ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
    これは、引数として$ 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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.