Magento 2에서 커스텀 로그 파일을 만드는 방법은 무엇입니까?


57

Magento 1에서는 로그를 다른 파일로 분할하는 것이 일반적이었습니다 (지불 방법 등을 위해 로그를 분리하기 위해). 의 $file매개 변수를 변경하는 것만 큼 쉽습니다 Mage::log.

Magento 2가 Monolog를 사용하도록 변경되었습니다.

Monolog (또는 Magento2의 구현)는 전체 프레임 워크의 모든 로그를 심각도별로 처리기로 분할하는 것으로 보입니다. 파일에 쓰는 몇 가지 핸들러가 있습니다.

\Magento\Framework\Logger\Handler\Debug, \Magento\Framework\Logger\Handler\Exception,\Magento\Framework\Logger\Handler\System

Magento 1에서와 같이 var / log의 각 파일에 로깅

특정 심각도에 대한 핸들러를 추가 할 수 있습니다 (IE,에 알림 쓰기 var/log/notice.log). \Magento\Framework\Logger\Handler\Base에서 핸들러를 확장 하고 등록하십시오 di.xml.

이 기사는 대략 그 프로세스를 설명합니다 : http://semaphoresoftware.kinja.com/how-to-create-a-custom-log-in-magento-2-1704130912

그러나 하나의 클래스 (모든 Magento가 아닌)에 대한 모든 로그 (심각도뿐만 아니라 모든 로그)를 선택한 파일에 쓰려면 어떻게해야합니까?

내 자신의 버전을 만들어야 할 것 Magento\Framework\Logger\Monolog같지만 실제로 작동하려면 모든 것이 어떻게 결합됩니까?

이것이 Magento 2에서 크지 않은 경우 대안은 무엇입니까? 클라이언트 사이트에서 필요할 때 디버깅하기 위해이 확장의 로그를 분리하고 싶습니다. 해당 정보를 system.log, exception.log 등에 작성하고 다른 모든 모듈의 로그와 혼동시키는 것은 실용적이지 않습니다.

답변:


99

Magento2의 로깅을 사용자 정의하거나 확장하지 않아도됩니다. 당신이 말했듯이 약간의 사용자 정의만으로 Monolog를 사용하고 있습니다. 적은 노력으로 Monolog를 확장하는 자신의 로거를 작성하는 것으로 충분합니다.

모듈이 있다고 가정 YourNamespace/YourModule:

1) 로거 클래스 작성 Logger/Logger.php:

<?php
namespace YourNamespace\YourModule\Logger;

class Logger extends \Monolog\Logger
{
}

2) 핸들러 클래스 작성 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';
}

참고 :이 단계는 마 젠토 코드를 사용하는 유일한 단계입니다. \Magento\Framework\Logger\Handler\BaseMonolog를 확장 StreamHandler하고 예를 들어 $ agentName 속성 앞에 Magento 기본 경로를 추가합니다.

3) 의존성 주입의 로거 등록 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>

참고 : 반드시 필요한 것은 아니지만 DI가 특정 인수를 생성자에 전달할 수 있습니다. 이 단계를 수행하지 않으면 생성자를 조정하여 핸들러를 설정해야합니다.

4) Magento 클래스에서 로거를 사용하십시오.

이것은 의존성 주입에 의해 수행됩니다. 아래에는 로그 항목 만 쓰는 더미 클래스가 있습니다.

<?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');
    }
}

2
요 전날 건축가 중 한 사람과 비슷한 것을 요청하고 있었으므로이 예제에 감사드립니다! DI 프레임 워크가 다른 클래스에 "올바른"로거를 삽입 할 수 있도록 클래스 이름을 기반으로 지원을 추가하고 이와 같은 코드 변경없이 플래그를 설정 / 해제하기 위해 관리자 스위치를 사용하는 것에 대해 궁금했습니다. 이런 종류의 기능은 사람들에게 얼마나 유용합니까?
Alan Kent

1
Manoj, 참조하는 템플릿에 로거가있는 블록 클래스가있는 경우 메시지를 로거에 전달하는 공개 메소드를 작성할 수 있습니다. _logger가 전혀 존재하지 않으면 _logger가 보호되어 있으므로 예제가 작동하지 않습니다.
halk

3
제 생각에는 현재의 접근 방식은 M1과는 조금 다릅니다. 로깅은 개발자 도구 여야하며 라이브 응용 프로그램을 모니터링하기위한 것이 아닙니다. 현재 구현을 재정의하는 개발에 사용하기 위해 선택적 다목적 단순화 라이브러리를 생성 한 다음 프로덕션 용도로 대체하는 방법을 알 수 있습니다.
barbazul

2
@AlanKent 나는 barbazul에 동의합니다 .M1에서 레벨을 빠르게 지정하여 원하는 파일에 쉽게 기록하는 기능이 훌륭했습니다. 이것은 부끄러운 유연성 (동적)이 아닙니다. 파일 이름을 기본 로거 호출의 매개 변수로 사용하는 것이 좋습니다. 답변 halk에 감사드립니다!
로비 애 버릴

2
나를 위해 항상 /var/log/system.log를 사용하고 있습니다.
MagePsycho

20

이와 같이 파일에 데이터를 기록 할 수 있습니다.

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/templog.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);

$logger->info("Info". $product->getSku() . "----- Id  ". $product->getId() );
$logger->info("preorder qty ". $product->getPreorderQty());

2
이것은 빠르고 쉽습니다
PMB

9

가장 간단한 방법 :

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/test.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info('Your text message');

6

Halk와 Pradeep Kumar의 답변 외에도 실제로 다른 파일에 기록하는 것이 유일한 문제라면 약간 더 쉬운 방법이 있습니다. 특히 여러 모듈에 통합하거나 모듈 내에서 다른 로그 파일을 원하는 경우. 이 방법을 사용하면 사용자 지정 처리기를 만들 필요가 없습니다.

모듈이 있다고 가정 MyNamespace/MyModule하고 사용자 정의 파일에 로그하려는 클래스를 호출 MyClass합니다. 클래스 생성자가 이미 주입 한 경우 \Psr\Log\LoggerInterface2) 단계로 건너 뜁니다. 그렇지 않으면 생성자에 주입해야합니다.

1) 수업에 LoggerInterface를 주입하십시오 MyClass.php.

<?php

namespace MyNamespace\MyModule;

use Psr\Log\LoggerInterface;

class MyClass
{
    /**
     * @var \Psr\Log\LoggerInterface
     */
    protected $logger;

    public function __construct(
        LoggerInterface $logger
    ) {
        $this->logger = $logger;
    }
}

로거 (예 :)가 이미 포함 된 클래스를 확장하는 경우 별도의 \Magento\Framework\App\Helper\AbstractHelper멤버 $_logger를 사용하는 대신 해당 멤버 (일반적으로 )를 덮어 쓸 수 있습니다 . 부모 생성자 지시문 $this->_logger = $logger 뒤에 추가하십시오 .

<?php

namespace MyNamespace\MyModule;

use Magento\Framework\App\Helper\Context;
use Psr\Log\LoggerInterface;

class MyClass extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function __construct(
        Context $context,
        LoggerInterface $logger
    ) {
        parent::__construct(
            $context
        );

        $this->_logger = $logger;
    }
}

2) 의존성 주입을 통한 로거 구성 etc/di.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="MyNamespace\MyModule\Logger\Handler" type="Magento\Framework\Logger\Handler\Base">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
            <argument name="fileName" xsi:type="string">/var/log/mymodule.log</argument>
        </arguments>
    </virtualType>
    <virtualType name="MyNamespace\MyModule\Logger\Logger" type="Magento\Framework\Logger\Monolog">
        <arguments>
            <argument name="name" xsi:type="string">MyModule Logger</argument>
            <argument name="handlers" xsi:type="array">
                <item name="system" xsi:type="object">MyNamespace\MyModule\Logger\Handler</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="MyNamespace\MyModule\MyClass">
        <arguments>
            <argument name="logger" xsi:type="object">MyNamespace\MyModule\Logger\Logger</argument>
        </arguments>
    </type>
</config>

모든 정보가에 기록됩니다 /var/log/mymodule.log.

다른 클래스에 대해 다른 파일에 로그인해야하는 경우 다른 가상 핸들러를 사용하여 다른 가상 로거를 작성하여 해당 클래스에 삽입 할 수 있습니다.


5

단일 수업 내에서만 필요한 경우 :

public function __construct(\Psr\Log\LoggerInterface $logger, \Magento\Framework\App\Filesystem\DirectoryList $dir) 
{
    $this->logger = $logger;
    $this->dir = $dir;

    $this->logger->pushHandler(new \Monolog\Handler\StreamHandler($this->dir->getRoot().'/var/log/custom.log'));
}

pushHandler가 인터페이스에 노출되지 않았으며 구현이 작동하지 않는 것 같습니다.
George

마 젠토 버전?
mshakeel

마 젠토 CE 2.2.0
조지

나는 CE 2.2.0에서 그것을 시도하고 당신에게 돌아올 것입니다. 나는 그것을 2.1
mshakeel

2

" praxigento / mage2_ext_logging "모듈을 사용해보십시오 . 이 모듈은 Magento 2에 "Monolog Cascade"지원을 추가합니다. "Monolog Cascade"를 사용하면 단일 구성 파일로 로깅 출력을 구성 할 수 있습니다. 당신은 당신의 자신의 코드를 수정하지 않고 다른 파일, 데이터베이스, 이메일 경고를 보내는 등으로 로그를 인쇄 할 수 있습니다.

구성 파일의 샘플입니다 (기본적으로 'var / log / logging.yaml').

disable_existing_loggers: true
formatters:
    dashed:
        class: Monolog\Formatter\LineFormatter
        format: "%datetime%-%channel%.%level_name% - %message%\n"
handlers:
    debug:
        class: Monolog\Handler\StreamHandler
        level: DEBUG
        formatter: dashed
        stream: /.../var/log/cascade_debug.log
    system:
        class: Monolog\Handler\StreamHandler
        level: INFO
        formatter: dashed
        stream: /.../var/log/cascade_system.log
    exception:
        class: Monolog\Handler\StreamHandler
        level: EMERGENCY
        formatter: dashed
        stream: /.../log/cascade_exception.log
processors:
    web_processor:
        class: Monolog\Processor\WebProcessor
loggers:
    main:
        handlers: [debug, system, exception]
        processors: [web_processor]

1

논리 변경이없고 사용자 정의 로그 파일 이름 만 변경해야하는 경우 사용자 정의 로거 클래스를 작성할 필요가 없으면 아래 단계 만 수행하십시오.

1. di.xml에서

 <type name="Magento\Framework\Logger\Monolog">
        <arguments>
            <argument name="name" xsi:type="string">test</argument>
            <argument name="handlers"  xsi:type="array">
                <item name="test" xsi:type="object">NAME_SPACE\Test\Model\Logger\Handler\Debug</item>
            </argument>
        </arguments>
    </type>

2. 핸들러

<?php
/**
 * Copyright © 2017 Alshaya, LLC. All rights reserved.
 * See LICENSE.txt for license details.
 *
 */
namespace NAME_SPACE\Test\Model\Logger\Handler;

use Magento\Framework\Logger\Handler\Base;

/**
 * Log handler for reports
 */
class Debug extends Base
{
    /**
     * @var string
     */
    protected $fileName = '/var/log/test.log';
}

여기서 당신은 당신이 기본 PSR 로그 호출 할 필요가 데이터를 기록하는 데 필요한 지금
이다

<?php
/**
 *
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace NAME_SPACE\Test\Controller\Index;

use Psr\Log\LoggerInterface;
class Index extends \Magento\Framework\App\Action\Action
{


    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * Show Contact Us page
     *
     * @return void
     */


    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        LoggerInterface $logger
    ) {
        parent::__construct($context);
        $this->logger = $logger;
    }


    public function execute()
    {
        $this->logger->critical((string) 'Test');
        $this->_view->loadLayout();
        $this->_view->renderLayout();
    }
}

따라서 위의 예는 시스템을 변경 해야하는 경우 모든 디버그 데이터를 test.log에 기록합니다 .di.xml에 아래 줄을 추가 할 수도 있습니다


0

나는 로그 파일을 거기에 넣고 custom.log 파일에 넣고 타사 코드에서 로거 객체 코드 아래에서 이것을 시도했다.이 코드를 확인하면 로그를 사용자 정의 로그 파일로 가져옵니다.

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/custom.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info('Your log details: ' .$variable);

여기에 추가 정보 의견이 필요한 경우 답변 해 드리겠습니다. 감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.