[由Atwix提供]{class="badge informative" title="Atwix"} [僅限PaaS]{class="badge informative" title="僅適用於雲端專案(Adobe管理的PaaS基礎結構)和內部部署專案的Adobe Commerce 。"}

寫入自訂記錄檔

Magento\Framework\Logger模組包含下列處理常式類別:

您可以在lib/internal/Magento/Framework/Logger/Handler目錄中找到它們。

您可以使用下列其中一種方法來登入自訂檔案:

  • di.xml中設定自訂記錄檔
  • 在自訂記錄器處理常式類別中設定自訂檔案

di.xml中設定自訂記錄檔

此範例說明如何使用虛擬型別debug訊息記錄到自訂記錄檔而非標準/var/log/debug.log中。

  1. 在您的模組的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>
    

    nameMagento\Payment\Model\Method\MyCustomDebug值必須是唯一的。

  2. 在另一具有唯一虛擬型別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>
    
  3. MyCustomLogger物件中插入​ ​虛擬型別Magento\Payment\Model\Method\Logger

    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>
    
  4. 虛擬類別Magento\Payment\Model\Method\MyCustomDebug已插入debug類別中$logger屬性的Magento\Payment\Model\Method\Logger處理常式。

    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個訊息記錄到特定記錄檔中。

  1. 建立記錄資料的類別。 在此範例中,類別是在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';
    }
    
  2. 在模組的檔案中,將此類別的處理常式定義為虛擬型別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是唯一識別碼。

  3. 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());
            }
        }
    }
    
  4. 類別Vendor\ModuleName\Logger\Handler\ErrorHandler已插入到error$logger屬性的Vendor\ModuleName\Observer\MyObserver處理常式。

    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檔案中。

recommendation-more-help
386822bd-e32c-40a8-81c2-ed90ad1e198c