Magento 2'de özel Log dosyası nasıl oluşturulur?


57

Magento 1'de günlükleri farklı dosyalara ayırmak yaygındı (ödeme yöntemleri için günlükleri ayırmak, vb.). Bu $fileparametrenin değiştirilmesi kadar kolaydır Mage::log.

Magento 2, Monolog kullanacak şekilde değişti.

Monolog'un (veya Magento2'nin uygulamasının) tüm çerçeveye yönelik tüm günlükleri işleyicilere önem derecesine göre bölümlere ayırdığı anlaşılıyor. Dosyaya yazacak birkaç işleyici var:

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

Magento 1'deki gibi var / log'da ilgili dosyalara giriş yapmak .

Belli bir ciddiyet için bir işleyici ekleyebilirim (IE, bildirimler yazmak var/log/notice.log). \Magento\Framework\Logger\Handler\Baseİşleyiciyi uzatın ve kaydedin di.xml.

Bu makale kabaca bu süreci anlatıyor: http://semaphoresoftware.kinja.com/how-to-create-a-custom-log-in-magento-2-1704130912

Ancak, bir sınıf için (Magento'nun değil) tüm günlüklerini (sadece bir ciddiyet değil) seçim dosyama nasıl yazabilirim?

Görünüşe göre kendi versiyonunu kendim oluşturmak zorunda kalacağım Magento\Framework\Logger\Monolog, fakat gerçekte çalışması için her şey nasıl bir araya geliyor?

Eğer Magento 2'de bu büyük bir hayır-hayır ise, alternatif nedir? Müşteri sitelerinde gerektiğinde hata ayıklamak amacıyla bu uzantı için günlükleri ayıracak bir şey istiyorum. Bu bilginin system.log, exception.log, vs.'ye yazılması ve diğer tüm modüllerin günlükleriyle karıştırılması pratik değildir.

Yanıtlar:


99

Magento2 günlüğünü özelleştirmeniz veya genişletmeniz gerekmiyor. Söylediğin gibi, Monolog'u sadece hafif bir kişiselleştirme ile kullanıyor. Monolog'u genişleten kendi kayıt cihazınızı çok az bir çaba ile yazmak yeterlidir.

Modülünüzün içinde olduğunu varsayalım YourNamespace/YourModule:

1) Logger sınıfı yaz Logger/Logger.php:

<?php
namespace YourNamespace\YourModule\Logger;

class Logger extends \Monolog\Logger
{
}

2) Handler sınıfı yaz 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';
}

Not: Bu Magento kodunu kullanan tek adımdır. \Magento\Framework\Logger\Handler\BaseMonolog's'ı genişletir StreamHandlerve örneğin Magento temel yoluyla $ fileName niteliğini hazırlar .

3) Bağımlılık Enjeksiyonunda Kayıt Logger'ı 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>

Not: Bu kesinlikle gerekli değildir ancak DI'nin yapıcıya belirli argümanlar iletmesine izin verir. Bu adımı yapmazsanız, işleyiciyi ayarlamak için yapıcıyı ayarlamanız gerekir.

4) Kaydediciyi Magento sınıflarınızda kullanın:

Bu Bağımlılık Enjeksiyonu ile yapılır. Aşağıda sadece bir günlük girişi yazan sahte bir sınıf bulacaksınız:

<?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
Geçen gün mimarlardan birine benzer bir şey soruyordum, bu yüzden bu örnek için teşekkürler! Sınıf adına dayalı destek eklemeyi merak ediyordum, böylece DI çerçevesi farklı sınıflara "sağ" logger'ı enjekte edebildi ve Yönetici'de böyle kod değişiklikleri yapmadan bayrakları açıp kapatacak anahtarlara sahip oldu. Bu tür bir işlevsellik insanlar için ne kadar faydalı olurdu?
Alan Kent,

1
Manoj, atıfta olduğunuz şablonun loggerlı bir blok sınıfı varsa, o zaman mesajı logger'a ileten bir genel yöntem yazabilirsiniz. Örnegin, _logger var ise korunmayacak, hiç çalismayacak
halk

3
Kanımca, şu anki yaklaşım M1'in sahip olduklarından bir adım geriye gidiyor. Günlüğe kaydetme aynı zamanda bir geliştirici aracı olmalıdır, yalnızca canlı bir uygulamayı izlemek için kullanılmaz. Mevcut uygulamayı geçersiz kılan geliştirmede kullanılmak üzere ve daha sonra üretim amacıyla değiştirilmek üzere isteğe bağlı çok amaçlı basitleştirilmiş bir kütüphanenin nasıl oluşturulduğunu görebiliyorum
barbazul

2
@AlanKent Burada barbazul ile aynı fikirdeyim - istediğiniz dosyaya kolayca giriş yapabilme, M1'deki seviyeyi hızlıca belirleme harikaydı. Bu utanılacak bir esnek değil (dinamik olarak). Dosya adı varsayılan günlük aramaları için bir parametre olarak olması iyi olurdu. Halkın cevabı için teşekkürler!
Robbie Averill,

2
Benim için her zaman /var/log/system.log dosyasını alıyor, neden olduğu hakkında bir fikriniz var mı?
MagePsycho

20

Verileri böyle bir dosyaya kaydedebiliriz.

$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
bu hızlı ve kolaydır
PMB

9

Mümkün olan en basit yol:

$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 ve Pradeep Kumar'ın cevaplarına ek olarak: Gerçekten tek endişeniz farklı bir dosyaya giriş yapmaksa, biraz daha kolay bir yol var. Özellikle bunu birden fazla modüle dahil etmek istiyorsanız veya modülünüzde farklı günlük dosyaları istiyorsanız. Bu yöntemle özel işleyiciler oluşturmanız gerekmez.

Modülünüzün içinde olduğunu MyNamespace/MyModuleve özel bir dosyaya giriş yapmak istediğiniz sınıf olduğunu varsayalım MyClass. Sınıfın kurucusu zaten enjekte ederse \Psr\Log\LoggerInterface2. adıma geçin. Aksi takdirde yapıcıya enjekte etmeniz gerekir:

1) Sınıfınıza LoggerInterface enjekte edin 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;
    }
}

Önceden bir logger (benzeri \Magento\Framework\App\Helper\AbstractHelper) içeren bir sınıfı genişletirseniz $_logger, ayrı bir tane kullanmak yerine bu üyenin (genellikle ) üzerine yazabilirsiniz . Sadece ana kurucu direktifinden $this->_logger = $logger sonra ekleyin .

<?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) Logger'ı bağımlılık enjeksiyonuyla yapılandırın 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>

Bu her şeyi günlüğe kaydeder /var/log/mymodule.log.

Farklı bir sınıf için farklı bir dosyaya giriş yapmanız gerekirse, başka bir sanal işleyiciyle başka bir sanal kayıt cihazı oluşturabilir ve o sınıfa enjekte edebilirsiniz.


5

Yalnızca tek sınıfınız içinde ihtiyacınız varsa:

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 arayüzünde açık bir yöntem değildir ve uygulama işe yaramadı ...
George

Magento versiyonunuz?
mshakeel

Magento CE 2.2.0
George,

CE 2.2.0'da deneyeceğim ve size geri döneceğim. Ben onu kullandım 2.1
mshakeel

2

" Praxigento / mage2_ext_logging " modülünü deneyin . Bu modül, Magento 2'ye "Monolog Cascade" desteği ekler. "Monolog Cascade", günlük çıkışını tek bir yapılandırma dosyasıyla yapılandırmanıza olanak tanır. Günlüklerinizi farklı dosyalara, veritabanlarına yazdırabilir, e-posta uyarıları gönderebilir ve kendi kodunuzda değişiklik yapmadan vb.

Bu, yapılandırma dosyasının bir örneğidir (varsayılan olarak '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

Herhangi bir mantık değişikliği yoksa ve sadece özel bir günlük dosyası adını değiştirmeniz gerekiyorsa, o zaman aşağıdaki özel adımları takip etmek için özel bir logger sınıfı oluşturmaya gerek yok

1. di.xml içinde

 <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. İşleyici

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

nereye varsayılan PSR günlüğü çağırmak için gereken verileri giriş yapmak için gerekli her zamankinden
olduğu

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

bu nedenle yukarıdaki örnekte, sisteminizi değiştirmeniz gerekiyorsa tüm hata ayıklama verilerini test.log dosyasına kaydedersiniz, ayrıca di.xml dosyasına aşağıdaki satırı ekleyebilirsiniz


0

Aşağıdaki logger nesne kodunu üçüncü taraf bir modülde denedim, burada oradaki günlük bilgisini almak istiyorum ve onları custom.log dosyasına getirdim, bu kodu kontrol edin, kesinlikle günlükleri özel günlük dosyasına aldım.

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

Burada daha fazla bilgi yorumuna ihtiyacınız varsa, cevap veririm. Teşekkür ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.