[Contributo di Atwix]{class="badge informative" title="Atwix"}

Scrivi in un file di registro personalizzato

Il modulo Magento\Framework\Logger contiene le seguenti classi di gestori:

È possibile trovarli nella directory lib/internal/Magento/Framework/Logger/Handler.

Per l'accesso a un file personalizzato è possibile utilizzare uno dei seguenti approcci:

  • Configura un file di registro personalizzato in di.xml
  • Configurare un file personalizzato nella classe del gestore di logger personalizzato

Configura un file di registro personalizzato in di.xml

In questo esempio viene illustrato come utilizzare tipi virtuali per registrare debug messaggi in un file di registro personalizzato anziché un /var/log/debug.log standard.

  1. Nel file di.xml del modulo, definisci un file di registro personalizzato come tipo virtuale.

    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>
    

    Il valore name di Magento\Payment\Model\Method\MyCustomDebug deve essere univoco.

  2. Definisci il gestore in un altro tipo virtuale con un name univoco:

    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. Inserire il MyCustomLogger tipo virtuale nell'oggetto 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. La classe virtuale Magento\Payment\Model\Method\MyCustomDebug viene inserita nel gestore debug della proprietà $logger nella classe 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>
    

Messaggi di eccezione registrati nel file /var/log/payment.log.

Configurare un file di registro personalizzato nella classe del gestore logger

In questo esempio viene illustrato come utilizzare una classe gestore logger personalizzata per registrare error messaggi in un file di log specifico.

  1. Crea una classe che registra i dati. In questo esempio, la classe è definita in 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. Definisci il gestore per questa classe come tipo virtuale nel file di.xml del modulo.

    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 è un identificatore univoco.

  3. Nella definizione type, specificare il nome della classe in cui viene inserito il gestore di logger personalizzato. Utilizzare il nome del tipo virtuale del passaggio precedente come argomento per questo tipo.

    code language-xml
    <type name="Vendor\ModuleName\Observer\MyObserver">
        <arguments>
            <argument name="logger" xsi:type="object">MyCustomLogger</argument>
        </arguments>
    </type>
    

    Codice Source della classe Vendor\ModuleName\Observer\MyObserver:

    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. La classe Vendor\ModuleName\Logger\Handler\ErrorHandler viene inserita nel gestore error della proprietà $logger in 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>
    ...
    

Messaggi di eccezione registrati nel file /var/log/my_custom_logger/error.log.

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