マジェント 2:Mage::log メソッドの代替?
-
13-12-2019 - |
質問
Magento 1 では、ログにメッセージを送信したい場合は、グローバルで静的メソッドを使用します。 Mage
クラス。
Mage::log($message, Zend_Log::DEBUG, "my-log-file.log");
Magento 2 には同等のものはありますか?私は グーグルで調べた 開発ドキュメントサイトを見ても、明らかな情報は何も出てきませんでした。あるよ このインチュ この記事はほぼ 1 年前のもので、それ以来多くのことが変わりました。
Magento 2 モジュール開発者として、Magento 1 の次のようなコードを置き換えたい場合
Mage::log($message, Zend_Log::DEBUG, "my-log-file.log");
最低限しなければならないことは何ですか?
解決
protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
$this->logger = $logger;
}
.
PSRロガー用のデバッグ、例外、システムを使用します。
$this->logger->info($message);
$this->logger->debug($message);
. 他のヒント
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));
. \Magento\Framework\App\ObjectManager::getInstance()
->get(\Psr\Log\LoggerInterface::class)->debug('message');
. 続きを読む: blog.mageprince.com
新しいファイルを持つ一時的な印刷ログ
$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
.
工場
Logger Object
を呼び出すには、 \ 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));
. デフォルトのロガーを使用したいがロギング(またはその他のカスタムロジック)にカスタムファイルを使用したい場合は、カスタムロガーハンドラを使用する必要があります。
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
簡単な方法では、依存密度の注入を作成したくない場合、または他のものを下回るコードを使用したくない場合は、ログインsystem.log
ファイル
$logger = \Magento\Framework\App\ObjectManager::getInstance()->get(\Psr\Log\LoggerInterface::class);
$logger->info('message');
.
それはすべてです。
いいえ、直接同等のものはありません。それは今や複雑なものです。
使用を使用して、ファイル内の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");
}
}
. 更新された:19/08/2019
あなたがエレガントなカスタムログハンドラを探している場合は、仮想タイプ(PHPコードを追加する必要はない)
を使用することをお勧めします。 Petar Dzhambazov と halk 、レディース、紳士私はあなたに重複したカスタムログコードの代わりに良くて短い方法を紹介しました。stackoverflow \ exct \ 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>
.
使用済み
ベンダー\ \ 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 \ exctor \ 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ファイルや線ではありません - Magento 2の利点を使用してください:仮想タイプ!!!
これが助けを願っています;)
2.2でロガーに1つの更新があります。Run SQLでロガーを有効にすることができます。
"INSERT INTO core_config_data (scope, scope_id, path, value) VALUES ('default', '0', 'dev/debug/debug_logging', '1');"
.
その後、上記の回答のようにPrint Logに\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));
}
. 注入する
$logger
コンストラクター内のクラス\Psr\Log\LoggerInterface $logger
これは、$logger を引数として渡すことで実現されます。初期化する
$logger
コンストラクター内$this->logger = $logger
ログを記録したいクラス内の関数で、以下の行を使用します
$this->logger->debug($message); $this->logger->log($level, $message);
カスタムログファイルでシングルクラス内に必要な場合:
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'));
}
. PSRロガーコードをコンストラクタに配置する:
protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
$this->logger = $logger;
}
.
その後、次のような機能で使用できます。
$this->logger->info($message);
.