Magento – Magento 2 , How to create new folder in var/log

logmagento-2.1

I wanted to add custom log files in separate folders. I have created one helper to create log and calling every time that helper.

Here is the helper file :

<?php

namespace Custom\Product\Helper;
use Magento\Framework\Filesystem;

class CustomLog {

    protected $_fileSystem;

    public function __construct(
        Filesystem $file_system
    ){
        $this->_fileSystem  = $file_system;
    }

    public function Clog($folder_name,$file_name,$data)
    {
        $directory = BP.'/var/log/'.$folder_name.'/'.$file_name;
        $writer = new \Zend\Log\Writer\Stream(BP . $directory);
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info($data);
    }


}

and I have tried with filesystem also still folder , files are not creating.

Here is the file system code :

public function Clog($folder_name,$file_name,$data)
    {
        $directory = BP.'/var/log/'.$folder_name;
        $writer = $this->_fileSystem->getDirectoryWrite($directory);
        $file = $writer->openFile($file_name, 'w');

    }

Please help me to resolve this issue .

Best Answer

Follow below steps to create your own custom log file under 'project_dir'/var/log. Step 1: Write Logger class in Logger/Logger.php

<?php
namespace YourNamespace\YourModule\Logger;

class Logger extends \Monolog\Logger
{
}

Step 2: Write Handler class in Logger/Handler.php

<?php
namespace YourNamespace\YourModule\Logger;

use Monolog\Logger;

    class Handler extends \Magento\Framework\Logger\Handler\Base
    {
        /**
         * Logging level
         * @var int
         */
        protected $loggerType = Logger::INFO;

        /**
         * File name
         * @var string
         */
        protected $fileName = '/var/log/myfilename.log';
    }

Step 3 : Register Logger in Dependency Injection etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <type name="YourNamespace\YourModule\Logger\Handler">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="YourNamespace\YourModule\Logger\Logger">
        <arguments>
            <argument name="name" xsi:type="string">myLoggerName</argument>
            <argument name="handlers"  xsi:type="array">
                <item name="system" xsi:type="object">YourNamespace\YourModule\Logger\Handler</item>
            </argument>
        </arguments>
    </type>
</config>

Step 4 : Use the logger in your Magento classes - This is done by Dependency Injection. Below you will find a dummy class which only writes a log entry

<?php
namespace YourNamespace\YourModule\Model;

class MyModel
{
    /**
     * Logging instance
     * @var \YourNamespace\YourModule\Logger\Logger
     */
    protected $_logger;

    /**
     * Constructor
     * @param \YourNamespace\YourModule\Logger\Logger $logger
     */
    public function __construct(
        \YourNamespace\YourModule\Logger\Logger $logger
    ) {
        $this->_logger = $logger;
    }

    public function doSomething()
    {
        $this->_logger->info('I did something');
    }
}

Hope its Helps!