You can create your custom log file as a module in the var/log folder. You can generate a .log file based on your module name or functionality-related name.
You need to create an etc/di.xml file and specify the virtual type for the logger.
Create a Virtual type for the class Magento\Framework\Logger\Handler\Base to specify your custom file name.
Custom Log file name: sms-message.log
Above file will be generated automatically at var/log folder.
<virtualType name="SmsMessageDebugLog" type="Magento\Framework\Logger\Handler\Base"> <arguments> <argument name="fileName" xsi:type="string">/var/log/sms-message.log</argument> </arguments> </virtualType>
Here name attribute value(SmsMessageDebugLog) must be unique in a system.
Create Handler Virtual type for class Magento\Framework\Logger\Monolog and the name value (SmsCustomLogger) must be unique in a system.
<virtualType name="SmsCustomLogger" type="Magento\Framework\Logger\Monolog"> <arguments> <argument name="handlers" xsi:type="array"> <item name="debug" xsi:type="object">SmsMessageDebugLog</item> </argument> </arguments> </virtualType>
Above, The virtual class SmsMessageDebugLog is injected into the handler of the $logger property in the Rbj\Sms\Model\SmsApi class.
Let’s say you need to write a log from the model file,
Model File: Rbj\Sms\Model\SmsApi
<type name="Rbj\Sms\Model\SmsApi"> <arguments> <argument name="logger" xsi:type="object">SmsCustomLogger</argument> </arguments> </type>
In the type property name value must be your PHP Class where you want to log your module customization.
The final code should be in etc/di.xml looks file,
<virtualType name="SmsMessageDebugLog" type="Magento\Framework\Logger\Handler\Base"> <arguments> <argument name="fileName" xsi:type="string">/var/log/sms-message.log</argument> </arguments> </virtualType> <virtualType name="SmsCustomLogger" type="Magento\Framework\Logger\Monolog"> <arguments> <argument name="handlers" xsi:type="array"> <item name="debug" xsi:type="object">SmsMessageDebugLog</item> </argument> </arguments> </virtualType> <type name="Rbj\Sms\Model\SmsApi"> <arguments> <argument name="logger" xsi:type="object">SmsCustomLogger</argument> </arguments> </type>
Now in the custom Model class, You can debug the log with the help of $logger and use any of the available logger functions like, error, alert, info, critical, emergency, notice, debug and warning.
<?php declare(strict_types=1); namespace Rbj\Sms\Model; use Psr\Log\LoggerInterface; /** * Send SMS API Implementation Model. */ class SmsApi { public function __construct( private readonly LoggerInterface $logger ){ } public function sendSms() { try { // code to send sms via API. } catch (\Exception $e) { $this->logger->error('Error on send text message' . $e->getMessage()); } } }
Now you can able to see log inside, var/log/sms-message.log file.