您不需要自定义或尝试扩展Magento2的日志记录。就像您说的那样,它使用的是Monolog,仅进行了少量定制。编写您自己的扩展Monolog的记录器就足够了。
假设您的模块在YourNamespace/YourModule
:
1)在Logger/Logger.php
以下位置编写Logger类:
<?php
namespace YourNamespace\YourModule\Logger;
class Logger extends \Monolog\Logger
{
}
2)在Logger/Handler.php
以下位置编写Handler类:
<?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
扩展Monolog的内容StreamHandler
,例如,在$ fileName属性前添加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');
}
}