마 젠토 2 : Mage :: log 방법 교체?


105

Magento 1에서 로그에 메시지를 보내려면 전역 Mage클래스 에서 정적 메서드를 사용합니다 .

Mage::log($message, Zend_Log::DEBUG, "my-log-file.log");

Magento 2에 해당하는 것이 있습니까? 나는 dev docs 사이트 봤는데 눈에 띄는 것을 보지 못했습니다. 거기에 이 Inchoo의 기사는하지만 거의 년 전에 그리고 너무 많은 그 이후로 변경되었습니다.

Magento 2 모듈 개발자로서 Magento 1에서 다음과 같은 코드를 바꾸려면

Mage::log($message, Zend_Log::DEBUG, "my-log-file.log");

내가해야 할 최소한은 무엇입니까?

답변:


124
protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
    $this->logger = $logger;
}

예를 들어 PSR 로거에 디버그, 예외, 시스템을 사용합니다.

$this->logger->info($message);
$this->logger->debug($message);

9
+1 감사합니다. 알 수있는 유용한 인터페이스 / 클래스 / 유형입니다. 그러나 정보가 기록 될 위치와 해당 위치를 변경하는 방법 (가능한 경우)은 명확하지 않습니다.
Alan Storm

Magento \ Framework \ Event 클래스에 대해 Manager.php를 확인하고이 줄을 추가하십시오 $ this-> logger-> debug ($ eventName); 페이지를 새로 고친 후보다 debug.txt 파일을 확인하면 특정 페이지의 모든 이름이 표시됩니다.
Pratik

2
기술적으로, 이것은 사용자 정의 클래스에서 로거를 인스턴스화하는 '올바른'방법입니다. 특히 빠른 디버그가 아닌 주변에 유지하려는 경우 특히 그렇습니다. 그러나 _logger 속성을 자동으로 인스턴스화하고 저장하는 몇 가지 핵심 클래스, 특히 블록 클래스가 있습니다. 이러한 핵심 클래스 중 하나를 확장하면 논리를 반복 할 필요가 없습니다. 다른 답변은 자신의 로그 파일을 정의하기위한 핸들러 작성에 관한 것이지만 기본 로그는 항상 /var/log/system.log 또는 /var/log/debug.log입니다. 특정 로깅 기능에 따라 사용되는 기능이 결정됩니다.
Jeremy Rimpo

7
나를 위해, "디버그"레벨은 구성> 고급> 개발자> 디버그에서 "파일에 로그"를 활성화 한 경우에만 작동하기 시작했습니다. 2.2 사용
오메르 사빅

122

magento2에서는 Zend다음과 같은 라이브러리를 사용하여 로그에 쓸 수도 있습니다.

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

편집

아래와 같이 PHP 객체와 배열을 인쇄 할 수도 있습니다.

$logger->info(print_r($yourArray, true));

7
+1 유용-Zend 로거가 PHP 배열 / 객체 등을 자동으로 포맷할지 여부를 알고 있습니까?
Alan Storm

1
@AlanStorm-예, 업데이트 된 답변을 확인하십시오.!
Manashvi Birla

2
@Manashvibirla : PHP objects인쇄하지 않습니다 ...
zed Blackbeard

1
@KeyurShah 우분투를 사용하면서 우분투를 염두에두고 솔루션을 제공했습니다.! 피드백 주셔서 감사합니다
Manashvi Birla

3
이러한 답변 중 일부는 그 자리에 있고 사용합니다. 분명히이 솔루션에는 표준 로거를 인스턴스화하기 위해 DI를 사용하는 것보다 거의 많은 코드가 필요하지만 사용자가 직접 로그 파일을 설정할 수있는 간단한 적절한 드롭 인입니다. 때로는 자신의 로그를 찾기 위해 표준 로그 파일을 검색하는 것이 성가시다. 따라서 이것은 좋은 '빠른'솔루션입니다.
Jeremy Rimpo

56
\Magento\Framework\App\ObjectManager::getInstance()
    ->get(\Psr\Log\LoggerInterface::class)->debug('message');

6
+1 감사합니다. 알 수있는 유용한 인터페이스 / 클래스 / 유형입니다. 그러나 정보가 기록 될 위치와 해당 위치를 변경하는 방법 (가능한 경우)은 명확하지 않습니다.
Alan Storm

1
정답입니다.
medina

4
ObjectManager를 직접 사용하는 것은 좋지 않습니다. 대신 DI를 사용하십시오
7ochem

12
영구 로깅 기능을 만드는 경우 @ 7ochem에 동의하지만 문제를 디버깅하기 위해 때때로 코어 (또는 타사) 클래스에 임시 로깅을 주입해야 할 수 있습니다. Logger 클래스를 생성자에 추가하는 힘든 과정을 거치는 것은 무의미하게 복잡합니다. 간단한 단일 라인 디버그 기능의 경우 아마도 가장 좋은 솔루션 일 것입니다. 그러나 자체 디버그 출력을 찾으려면 기본 로그 파일을 검색해야합니다.
Jeremy Rimpo

또한 새 복사본을 인스턴스화하지 않고 액세스 할 수있는 _logger 속성이있는 몇 가지 핵심 클래스 (특히 블록 클래스)가 있습니다.
Jeremy Rimpo

28

새 파일이 포함 된 임시 인쇄 로그

$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/logfile.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info('Simple Text Log'); // Simple Text Log
$logger->info('Array Log'.print_r($myArrayVar, true)); // Array Log

공장 방법

로거 객체를 호출하려면 \ Psr \ Log \ LoggerInterface 클래스를 생성자 에 주입해야 합니다.

protected $_logger;
public function __construct(
...
\Psr\Log\LoggerInterface $logger
...
) {
    $this->_logger = $logger;
}

public function logExample() {

    //To print string Output in debug.log
    $this->_logger->addDebug('Your Text Or Variables'); 

    // To print array Output in system.log
    $this->_logger->log('600', print_r($yourArray, true));

}

또는 phtml 파일에서이 코드를 직접 사용하십시오.

debug.log에서 문자열 출력을 인쇄하려면

\Magento\Framework\App\ObjectManager::getInstance()
   ->get('Psr\Log\LoggerInterface')->debug('Your Message');

system.log에 배열 출력을 인쇄하려면

$myArray = array('test1'=>'123', 'test2'=>'123', 'test3'=>'123');
$level = '100'; // use one of: 100, 200, 250, 300, 400, 500, 550, 600
\Magento\Framework\App\ObjectManager::getInstance()
    ->get('Psr\Log\LoggerInterface')
    ->log($level, print_r($myArray, true));

10

로깅 (또는 다른 사용자 정의 로직)에 기본 로거이지만 사용자 정의 파일을 사용하려면 사용자 정의 로거 핸들러를 사용해야합니다.

class Logger extends Magento\Framework\Logger\Handler\Base
{
  /**
   * @var string
   */
  protected $fileName = '/var/log/my-log-file.log';

  /**
   * @var int
   */
  protected $loggerType = MonologLogger::DEBUG;
}

그런 다음 코드 내에서 핸들러로 추가하십시오.

protected function addCustomLogHandler()
{
    $logger = Data::getCustomLogger();
    if(isset($this->_logger)){
        $this->_logger->pushHandler($logger);
    }
}

편의성 IMO의 퇴보


+1 유용한 정보, 감사합니다! 그러나이 로거 컨텍스트를 PSR-3 오토로더 인터페이스와 함께 사용 하는 방법이 명확하지 않습니다. 즉, 로깅중인 경우 $this->logger->info($message, $level);"컨텍스트 사용"은 무엇입니까?
Alan Storm

2
문제는 Monolog에 사용 가능한 모든 핸들러가 루프되고 먼저 레코드 레벨 (DEBUG, INFO 등)을 처리 할 수있는 핸들러가 사용된다는 것입니다. 따라서 핸들러가 사용되었다는 것을 확실하게 알 수있는 유일한 방법은 스택을 맨 먼저 가져 와서 루프에서 가장 먼저 처리해야합니다. 또 다른 방법은 처리기로 설정하여 다른 모든 것을 제거하는 것이지만 그다지 친숙하지는 않습니다.
Petar Dzhambazov

2.0.0 GA에 추가 처리기를 도입하거나 di.xml에서 처리기를 지정하는 경우이 문제를 알고 싶을 수도 있습니다. github.com/magento/magento2/issues/2529 이 문제에 부딪 쳤습니다. 사용자 정의 로거가 사용자 정의 로그 파일 핸들을 갖도록하고 일부 항목을 데이터베이스 테이블에 쓰는 사용자 정의 핸들러를 가져옵니다.
mttjohnson

9

간단한 방법으로 의존성 주입이나 다른 코드를 사용하지 않으려면 system.log파일에 로그를 저장 합니다.

$logger = \Magento\Framework\App\ObjectManager::getInstance()->get(\Psr\Log\LoggerInterface::class);
$logger->info('message');

그게 다야..



4

use 및 call addDebug()메소드 를 사용 하여 파일에 psr 로거 클래스를 포함 시키십시오 . 이것은 var/log/debug.log파일에 로그 메시지를 인쇄 합니다

use Psr\Log\LoggerInterface;

class demo {
  function demo()
  {
    //EDIT: Using debug instead of addDebug for PSR compatiblity
    $this->_objectManager->get('Psr\Log\LoggerInterface')->debug("your message goes here");
  }

}

2
psr 로거와 호환되지 않으므로 addDebug를 사용해서는 안됩니다. 대신 디버그를 사용하십시오.
Maciej Paprocki

4

업데이트 날짜 : 19/08/2019

우아한 사용자 정의 로그 처리기를 찾고 있다면 가상 유형을 사용하는 것이 좋습니다 (PHP 코드를 추가 할 필요가 없습니다)

Petar Dzhambazovhalk 의 답변에서 영감을 얻은 신사 숙녀 여러분, 항상 사용자 정의 로그 코드를 복제하는 대신 더 좋고 짧은 방법을 소개했습니다.

StackOverflow \ 예 \ etc \ di.xml

<!-- Custom log file for StackOverflow ; Duplicate it as much as you want separate log file -->
<virtualType name="StackOverflow\Example\Model\Logger\VirtualDebug" type="Magento\Framework\Logger\Handler\Base">
    <arguments>
        <argument name="fileName" xsi:type="string">/var/log/stackoverflow/donald_trump.log</argument>
    </arguments>
</virtualType>
<virtualType name="StackOverflow\Example\Model\Logger\VirtualLogger" type="Magento\Framework\Logger\Monolog">
    <arguments>
        <argument name="name" xsi:type="string">DonaldTrump</argument>
        <argument name="handlers" xsi:type="array">
            <item name="debug" xsi:type="object"> StackOverflow\Example\Model\Logger\VirtualDebug</item>
        </argument>
    </arguments>
</virtualType>

용법

공급 업체 \ Something \ Model \ DonaldTrump.php

<?php
/**
 * Copyright © 2016 Toan Nguyen <https://nntoan.github.io>. All rights reserved.
 * See COPYING.txt for license details.
 *
 * This is the file you want to inject your custom logger.
 * Of course, your logger must be an instance of \Psr\Log\LoggerInterface.
 */

namespace Vendor\Something\Model;

/**
 * DonaldTrump business logic file
 *
 * @package Vendor\Something\Model
 * @author  Toan Nguyen <https://github.com/nntoan>
 */
class DonaldTrump
{
    /**
     * @var \Psr\Log\LoggerInterface
     */
    private $logger;

    /**
     * DonaldTrump constructor.
     *
     * @param \Psr\Log\LoggerInterface $logger
     */
    public function __construct(
        \Psr\Log\LoggerInterface $logger,
    ) {
        $this->logger = $logger;
    }

    // 1 billion lines of code after this line
}

StackOverflow \ 예 \ etc \ frontend \ di.xml

<type name="Vendor\Something\Model\DonaldTrump">
    <arguments>
        <argument name="logger" xsi:type="object">StackOverflow\Example\Model\Logger\VirtualLogger</argument>
    </arguments>
</type>

그게 다야, 여분의 PHP 파일이나 라인이 없습니다-Magento 2 : Virtual Types의 장점을 사용하십시오 !!!

도움이 되었기를 바랍니다 ;)


3
이 코드는 PSI를 구현하고 있습니까? (Political Statements Injection) : P
7ochem

1
@ 7ochem 아, 맞아요 : v
Toan Nguyen

2

2.2에는 로거에 대한 업데이트가 하나 있습니다. SQL을 실행하여 로거를 프로덕션 모드로 사용할 수 있습니다.

 "INSERT INTO core_config_data (scope, scope_id, path, value) VALUES ('default', '0', 'dev/debug/debug_logging', '1');"

그런 다음 \Psr\Log\LoggerInterface 위의 답변과 같이 인쇄 로그에 사용할 수 있습니다 .

protected $logger;

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

public function yourFunction() {
    $data = ["test" => "testing"];
    $this->logger->debug(var_export($data, true));
}

덕분에 QUERY SQL 대신에 이것을 사용할 수도 있습니다.In the Magento admin panel, go to "Stores" -> "Configuration" -> "Advanced" -> "Developer" -> "Debug" -> "Log to File". Setting this to "Yes" will cause debug information to be logged to var/log/debug.log in your Magento application directory.
fudu

1
  1. $logger생성자에 클래스 삽입 \Psr\Log\LoggerInterface $logger
    이것은 $ logger를 인수로 전달함으로써 달성됩니다.

  2. $logger생성자에서 초기화

    $this->logger = $logger
  3. 로깅하려는 클래스 내에서 아래 줄을 사용하십시오.

    $this->logger->debug($message);
    $this->logger->log($level, $message);

1

사용자 정의 로그 파일을 사용하여 단일 클래스 내에 필요한 경우 :

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

0

생성자에 PSR 로거 코드를 배치하십시오.

protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
    $this->logger = $logger;
}

다음과 같이 함수에서 사용할 수 있습니다.

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