Magento 2: Thay thế cho phương pháp Mage :: log?


105

Trong Magento 1, nếu bạn muốn gửi tin nhắn đến nhật ký, bạn sẽ sử dụng một phương thức tĩnh trên Magelớp toàn cầu .

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

Có tương đương trong Magento 2 không? Tôi đã đi qua trang web dev docs và không thấy bất cứ điều gì rõ ràng xuất hiện. Có bài viết Inchoo này, nhưng nó đã có từ gần một năm trước và rất nhiều thứ đã thay đổi kể từ đó.

Là nhà phát triển mô-đun Magento 2, nếu tôi muốn thay thế mã như sau trong Magento 1

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

Tối thiểu tôi cần phải làm gì?

Câu trả lời:


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

Bạn sử dụng gỡ lỗi, ngoại lệ, hệ thống cho PSR Logger chẳng hạn:

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

9
+1 Cảm ơn bạn, đó là một giao diện / lớp / loại hữu ích cần biết - nhưng không rõ câu trả lời của bạn nơi thông tin sẽ được ghi lại và cách (nếu có thể) để thay đổi vị trí đó.
Alan Storm

Bạn kiểm tra Manager.php để theo dõi lớp Magento \ Framework \ Event và thêm dòng này $ this-> logger-> debug ($ eventName); hơn sau khi làm mới trang và kiểm tra tệp debug.txt, bạn nhận được tất cả tên evant cho trang cụ thể.
Pratik

2
Về mặt kỹ thuật, đây là cách 'chính xác' để khởi tạo một logger trong các lớp tùy chỉnh của riêng bạn - đặc biệt nếu bạn có ý định giữ nó xung quanh thay vì chỉ gỡ lỗi nhanh. Tuy nhiên, có một số lớp cốt lõi - đặc biệt là các lớp Block - tự động khởi tạo và lưu trữ thuộc tính _logger. Nếu bạn mở rộng một trong những lớp cốt lõi này thì không cần phải lặp lại logic. Các câu trả lời khác đào sâu vào việc tạo trình xử lý để xác định tệp nhật ký của riêng bạn, nhưng nhật ký mặc định luôn là /var/log/system.log hoặc /var/log/debug.log. Tôi tin rằng chức năng ghi nhật ký cụ thể xác định được sử dụng.
Jeremy Rimpo

7
Đối với tôi, mức độ "gỡ lỗi" chỉ bắt đầu hoạt động khi tôi bật "Đăng nhập vào tệp" trong Cấu hình> Nâng cao> Nhà phát triển> Gỡ lỗi. Sử dụng 2.2
Omer Sabic

122

Trong magento2, Bạn cũng có thể ghi vào nhật ký bằng Zendthư viện như dưới đây:

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

Đã chỉnh sửa

Bạn cũng có thể in các đối tượng và mảng PHP như bên dưới:

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

7
+1 Hữu ích - bạn có biết Zger logger sẽ tự động định dạng các mảng / đối tượng PHP không?
Alan Storm

1
@AlanStorm - Có, bạn có thể, kiểm tra câu trả lời cập nhật của tôi.!
Manashvi Birla

2
@Manashvibirla: PHP objectskhông in ...
zed Blackbeard

1
@KeyurShah Giải pháp được cung cấp bằng cách ghi nhớ ubfox, vì tôi đang sử dụng ubfox.! cảm ơn vì đã phản hồi
Manashvi Birla

3
Một số câu trả lời có vị trí và cách sử dụng. Rõ ràng giải pháp này đòi hỏi gần như nhiều mã như sử dụng DI để khởi tạo trình ghi nhật ký tiêu chuẩn - nhưng đó là một trình đơn thả tại chỗ đơn giản cho phép bạn đặt tệp nhật ký của riêng mình. Đôi khi thật khó chịu khi tìm kiếm thông qua các tệp nhật ký tiêu chuẩn - có xu hướng bị lộn xộn - để tìm nhật ký của riêng bạn. Vì vậy, đây là một giải pháp 'nhanh chóng' tốt đẹp cho điều đó.
Jeremy Rimpo

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

6
+1 Cảm ơn bạn, đó là một giao diện / lớp / loại hữu ích cần biết - nhưng không rõ câu trả lời của bạn nơi thông tin sẽ được ghi lại và cách (nếu có thể) để thay đổi vị trí đó.
Alan Storm

1
Đó là câu trả lời đúng.
medina

4
Tôi không khuyên bạn nên sử dụng ObjectManager trực tiếp. Sử dụng DI thay thế
7ochem

12
Mặc dù tôi đồng ý với @ 7ochem nếu bạn đang tạo một chức năng ghi nhật ký vĩnh viễn, đôi khi có thể cần phải đăng nhập tạm thời vào các lớp lõi (hoặc bên thứ ba) để gỡ lỗi. Trải qua quá trình khó khăn để thêm một lớp Logger vào hàm tạo là quá phức tạp trong những trường hợp này. Đối với một hàm gỡ lỗi đơn giản, đơn giản, đây có lẽ là giải pháp tốt nhất. Tuy nhiên, bạn sẽ phải đối phó với việc tìm kiếm thông qua các tệp nhật ký mặc định để tìm đầu ra gỡ lỗi của riêng bạn.
Jeremy Rimpo

Ngoài ra, hãy nhớ rằng có một số lớp cốt lõi - đặc biệt là các lớp Block - có thuộc tính _logger mà bạn có thể truy cập mà không cần tạo một bản sao mới.
Jeremy Rimpo

28

Nhật ký in tạm thời với tệp mới

$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

Phương pháp nhà máy

Bạn cần đưa lớp \ Psr \ Log \ LoggerInterface vào hàm tạo để gọi đối tượng logger

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

}

Hoặc bạn trực tiếp sử dụng mã này trong tệp phtml:

Để in chuỗi đầu ra trong debug.log

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

Để in mảng Đầu ra trong 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

Nếu bạn muốn sử dụng logger mặc định nhưng tệp tùy chỉnh để ghi nhật ký (hoặc logic tùy chỉnh khác), bạn cần sử dụng trình xử lý logger tùy chỉnh:

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

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

Sau đó thêm nó làm trình xử lý ở đâu đó trong mã của bạn:

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

Một bước lùi trong IMO tiện lợi


+1 Thông tin hữu ích, cảm ơn bạn! Tuy nhiên, không rõ bạn sử dụng bối cảnh logger này với giao diện tự động tải PSR-3 $this->logger->info($message, $level);như thế nào - tức là nếu bạn đang đăng nhập - bạn nói "sử dụng ngữ cảnh của tôi" như thế nào?
Alan Storm

2
Vâng, điều là tất cả các trình xử lý có sẵn cho Monolog đều được lặp và đầu tiên có thể xử lý mức độ bản ghi (DEBUG, INFO, v.v.) được sử dụng. Vì vậy, cách duy nhất tôi thấy để hoàn toàn chắc chắn rằng trình xử lý của bạn được sử dụng, là đẩy nó trước khi bạn cần, vì vậy nó ở trên cùng của ngăn xếp và đứng đầu trong vòng lặp. Một cách khác là chỉ cần thiết lập nó như xử lý, loại bỏ tất cả những thứ khác, nhưng đó sẽ không phải là điều rất thân thiện để làm.
Petar Dzhambazov

Nếu bạn cố gắng giới thiệu các trình xử lý bổ sung trong GA 2.0.0 hoặc làm việc với việc chỉ định các trình xử lý trong di.xml, bạn có thể muốn biết về vấn đề này github.com/magento/magento2/issues/2529 Tôi đã gặp phải vấn đề này để có được một trình ghi nhật ký tùy chỉnh để có một trình xử lý tệp nhật ký tùy chỉnh và một trình xử lý tùy chỉnh ghi một số mục vào bảng cơ sở dữ liệu.
mttjohnson 7/12/2015

9

Nói một cách đơn giản, nếu bạn không muốn tạo nội dung phụ thuộc hoặc bất kỳ thứ gì khác sử dụng mã bên dưới, nó sẽ lưu system.logtệp đăng nhập

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

Đó là tất cả..


5

Không, không có tương đương trực tiếp. Bây giờ nó hơi phức tạp.

Xem: Đăng nhập vào một tệp tùy chỉnh trong Magento 2


1
+1, cảm ơn bạn! Tuy nhiên - các câu trả lời khác làm cho nó có vẻ như có thể có một logger duy nhất và cách tiếp cận mở rộng / tạo xử lý không còn cần thiết nữa. Bạn có biết điều đó có đúng không?
Alan Storm

4

Bao gồm lớp logger psr trong tệp của bạn bằng cách sử dụng và sau đó gọi addDebug()phương thức. Điều này sẽ in thông điệp tường trình trong var/log/debug.logtập tin

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
bạn không nên sử dụng addDebug vì nó không tương thích với trình ghi nhật ký psr. sử dụng chỉ gỡ lỗi thay thế.
Maciej Paprocki

4

CẬP NHẬT: 19/08/2019

Nếu bạn đang tìm kiếm trình xử lý nhật ký tùy chỉnh thanh lịch, tôi khuyên bạn nên sử dụng Loại ảo (không cần thêm bất kỳ mã PHP nào)

Lấy cảm hứng từ câu trả lời của Petar Dzhambazovhalk , thưa quý vị và các bạn, tôi đã giới thiệu cho bạn một cách tốt hơn và ngắn hơn thay vì mã nhật ký tùy chỉnh trùng lặp mọi lúc.

StackOverflow \ Ví dụ \ 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>

SỬ DỤNG

Nhà cung cấp \ 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 \ Ví dụ \ 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>

Đó là tất cả, không có tệp hoặc dòng PHP bổ sung - sử dụng các ưu điểm của Magento 2: Các loại ảo !!!

Hi vọng điêu nay co ich ;)


3
Là mã này thực hiện PSI? (Tiêm tuyên bố chính trị): P
7ochem

1
@ 7ochem Ồ vâng, đó là: v
Toàn Nguyễn

2

Có một bản cập nhật cho logger trong 2.2. Bạn có thể bật logger cho chế độ sản xuất bằng cách chạy SQL:

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

Sau đó, bạn có thể sử dụng \Psr\Log\LoggerInterface cho nhật ký in giống như câu trả lời ở trên:

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

cảm ơn và bạn cũng có thể sử dụng cái này thay vì 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. $loggerLớp tiêm trong hàm tạo \Psr\Log\LoggerInterface $logger
    Điều này đạt được bằng cách chuyển $ logger làm đối số.

  2. Khởi tạo $loggertrong constructor

    $this->logger = $logger
  3. Trong hàm trong lớp bạn muốn đăng nhập, hãy sử dụng dòng dưới đây

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

1

Nếu bạn cần nó trong lớp duy nhất của bạn với tệp nhật ký tùy chỉnh:

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

Đặt mã logger PSR trong hàm tạo của bạn:

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

sau đó bạn có thể sử dụng trong chức năng của mình như:

$this->logger->info($message);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.