[由Atwix提供]{class="badge informative" title="阿特维克斯"}
写入自定义日志文件
Magento\Framework\Logger
模块包含以下处理程序类:
/var/log/debug.log
/var/log/exception.log
/var/log/system.log
您可以在lib/internal/Magento/Framework/Logger/Handler
目录中找到它们。
您可以使用以下方法之一登录到自定义文件:
- 在
di.xml
中设置自定义日志文件 - 在自定义记录器处理程序类中设置自定义文件
在di.xml
中设置自定义日志文件
此示例说明如何使用虚拟类型将debug
消息记录到自定义日志文件而不是标准/var/log/debug.log
中。
-
在模块的
di.xml
文件中,将自定义日志文件定义为虚拟类型。code language-xml <virtualType name="Magento\Payment\Model\Method\MyCustomDebug" type="Magento\Framework\Logger\Handler\Base"> <arguments> <argument name="fileName" xsi:type="string">/var/log/payment.log</argument> </arguments> </virtualType>
Magento\Payment\Model\Method\MyCustomDebug
的name
值必须是唯一的。 -
在另一具有唯一
name
的虚拟类型中定义处理程序:code language-xml <virtualType name="Magento\Payment\Model\Method\MyCustomLogger" type="Magento\Framework\Logger\Monolog"> <arguments> <argument name="handlers" xsi:type="array"> <item name="debug" xsi:type="object">Magento\Payment\Model\Method\MyCustomDebug</item> </argument> </arguments> </virtualType>
-
在
Magento\Payment\Model\Method\Logger
对象中插入MyCustomLogger
虚拟类型:code language-xml <type name="Magento\Payment\Model\Method\Logger"> <arguments> <argument name="logger" xsi:type="object">Magento\Payment\Model\Method\MyCustomLogger</argument> </arguments> </type>
-
虚拟类
Magento\Payment\Model\Method\MyCustomDebug
被插入到Magento\Payment\Model\Method\Logger
类中$logger
属性的debug
处理程序中。code language-xml ... <argument name="handlers" xsi:type="array"> <item name="debug" xsi:type="object">Magento\Payment\Model\Method\MyCustomDebug</item> </argument>
异常消息记录到/var/log/payment.log
文件中。
在记录器处理程序类中设置自定义日志文件
此示例说明如何使用自定义记录器处理程序类将error
消息记录到特定日志文件中。
-
创建记录数据的类。 在此示例中,该类在
app/code/Vendor/ModuleName/Logger/Handler/ErrorHandler.php
中定义。code language-php <?php /** * @author Vendor * @copyright Copyright (c) 2019 Vendor (https://www.vendor.com/) */ namespace Vendor\ModuleName\Logger\Handler; use Magento\Framework\Logger\Handler\Base as BaseHandler; use Monolog\Logger as MonologLogger; /** * Class ErrorHandler */ class ErrorHandler extends BaseHandler { /** * Logging level * * @var int */ protected $loggerType = MonologLogger::ERROR; /** * File name * * @var string */ protected $fileName = '/var/log/my_custom_logger/error.log'; }
-
在模块的
di.xml
文件中将此类的处理程序定义为虚拟类型。code language-xml <virtualType name="MyCustomLogger" type="Magento\Framework\Logger\Monolog"> <arguments> <argument name="handlers" xsi:type="array"> <item name="error" xsi:type="object">Vendor\ModuleName\Logger\Handler\ErrorHandler</item> </argument> </arguments> </virtualType>
MyCustomLogger
是唯一标识符。 -
在
type
定义中,指定插入自定义记录器处理程序的类名。 使用上一步中的虚拟类型名称作为此类型的参数。code language-xml <type name="Vendor\ModuleName\Observer\MyObserver"> <arguments> <argument name="logger" xsi:type="object">MyCustomLogger</argument> </arguments> </type>
Vendor\ModuleName\Observer\MyObserver
类的Source代码:code language-php <?php /** * @author Vendor * @copyright Copyright (c) 2019 Vendor (https://www.vendor.com/) */ declare(strict_types=1); namespace Vendor\ModuleName\Observer; use Psr\Log\LoggerInterface as PsrLoggerInterface; use Exception; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Event\Observer; /** * Class MyObserver */ class MyObserver implements ObserverInterface { /** * @var PsrLoggerInterface */ private $logger; /** * MyObserver constructor. * * @param PsrLoggerInterface $logger */ public function __construct( PsrLoggerInterface $logger ) { $this->logger = $logger; } /** * @param Observer $observer */ public function execute(Observer $observer) { try { // some code goes here } catch (Exception $e) { $this->logger->error($e->getMessage()); } } }
-
类
Vendor\ModuleName\Logger\Handler\ErrorHandler
被插入到Vendor\ModuleName\Observer\MyObserver
中$logger
属性的error
处理程序中。code language-xml ... <argument name="handlers" xsi:type="array"> <item name="error" xsi:type="object">Vendor\ModuleName\Logger\Handler\ErrorHandler</item> </argument> ...
异常消息记录在/var/log/my_custom_logger/error.log
文件中。