The Magento\Framework\Logger
module contains the following handler classes:
Class | Log file |
---|---|
Magento\Framework\Logger\Handler\Base | - |
Magento\Framework\Logger\Handler\Debug | /var/log/debug.log |
Magento\Framework\Logger\Handler\Exception | /var/log/exception.log |
Magento\Framework\Logger\Handler\Syslog | - |
Magento\Framework\Logger\Handler\System | /var/log/system.log |
You may find them in the lib/internal/Magento/Framework/Logger/Handler
directory.
You can use one of the following approaches for logging into a custom file:
di.xml
di.xml
This example shows how to use virtual types to log debug
messages into a custom log file instead of a standard /var/log/debug.log
.
In the di.xml
file of your module, define a custom log file as a virtual type.
<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>
The name
value of Magento\Payment\Model\Method\MyCustomDebug
must be unique.
Define the handler in another virtual type with a unique name
:
<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>
Inject the MyCustomLogger
virtual type in the Magento\Payment\Model\Method\Logger
object:
<type name="Magento\Payment\Model\Method\Logger">
<arguments>
<argument name="logger" xsi:type="object">Magento\Payment\Model\Method\MyCustomLogger</argument>
</arguments>
</type>
The virtual class Magento\Payment\Model\Method\MyCustomDebug
is injected into the debug
handler of the $logger
property in the Magento\Payment\Model\Method\Logger
class.
...
<argument name="handlers" xsi:type="array">
<item name="debug" xsi:type="object">Magento\Payment\Model\Method\MyCustomDebug</item>
</argument>
Exception messages are logged into the /var/log/payment.log
file.
This example shows how to use a custom logger handler class to log error
messages into a specific log file.
Create a class that logs data. In this example, the class is defined in app/code/Vendor/ModuleName/Logger/Handler/ErrorHandler.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';
}
Define the handler for this class as a virtual type in the module’s di.xml
file.
<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
is a unique identifier.
In the type
definition, specify the class name where the custom logger handler is injected. Use the virtual type name from the previous step as an argument for this type.
<type name="Vendor\ModuleName\Observer\MyObserver">
<arguments>
<argument name="logger" xsi:type="object">MyCustomLogger</argument>
</arguments>
</type>
Source code of Vendor\ModuleName\Observer\MyObserver
class:
<?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());
}
}
}
The class Vendor\ModuleName\Logger\Handler\ErrorHandler
is injected into the error
handler of the $logger
property in the Vendor\ModuleName\Observer\MyObserver
.
...
<argument name="handlers" xsi:type="array">
<item name="error" xsi:type="object">Vendor\ModuleName\Logger\Handler\ErrorHandler</item>
</argument>
...
Exception messages are logged in the /var/log/my_custom_logger/error.log
file.