मैंने सिम्फनी में कस्टम लॉग हैंडलर बनाया है। इसे बनाना कोई समस्या नहीं थी, config: config/packages/dev/monolog.yaml

monolog:
    handlers:
     ....
        alerts:
            type: service
            id: App\Logger\AlertLogger
            channels: [app]
            level:  warning

और मेरी सेवा:

<?php

namespace App\Logger;
use Monolog\Handler\AbstractProcessingHandler;
class AlertLogger extends AbstractProcessingHandler
{
    protected function write(array $record)
    {
        // handle log
    }
}

लेकिन समस्या यह है कि मैं इस लॉग को RabbitMQ को भेजना चाहता हूं और उपभोक्ता में कुछ करना चाहता हूं, लेकिन किसी अन्य सेवा को कॉल करने का कोई तरीका नहीं है। मैंने इसे निर्माण के लिए पास करने का प्रयास किया, लेकिन मुझे त्रुटियां मिल रही हैं जैसे:

तर्क 3 App\Logger\AlertLogger::__construct() को पास किया गया इंटरफ़ेस OldSound\RabbitMqBundle\RabbitMq\ProducerInterface, स्ट्रिंग दी गई, जिसे कॉल किया जाता है, को लागू करना चाहिए .....

ऐसा इसलिए है क्योंकि AbstractProcessingHandler में एक निर्माण परिभाषा है।

=============== संपादित करें: मेरे परीक्षण:

माता-पिता वर्ग निर्माता:

public function __construct($level = Logger::DEBUG, $bubble = true)
{
    $this->setLevel($level);
    $this->bubble = $bubble;
}

मैंने सेवाओं के लिए एक सेवा के रूप में लॉग हैंडलर जोड़ने की कोशिश की। yaml:

services:
    .....
    App\Logger\AlertLogger:
        arguments:
            $producer: OldSound\RabbitMqBundle\RabbitMq\Producer

और मेरा लॉग हैंडलर:

...
class AlertLogger extends AbstractProcessingHandler
{
    /**
     * @var ProducerInterface
     */
    private $producer;
    public function __construct(ProducerInterface $producer)
    {
        $this->producer = $producer;
    }
  ......

लेकिन मुझे यह त्रुटि मिल रही है:

तर्क 1 App\Logger\AlertLogger::__construct() को पास किया गया इंटरफ़ेस OldSound\RabbitMqBundle\RabbitMq\ProducerInterface, दिए गए स्ट्रिंग को लागू करना चाहिए, जिसे कॉल किया जाता है

जब मैं निर्माण तर्क सेट करने का प्रयास करता हूं:

....
class AlertLogger extends AbstractProcessingHandler
{
    /**
     * @var ProducerInterface
     */
    private $producer;
    public function __construct($level, $bubble, ProducerInterface $producer)
    {
        parent::__construct($level, $bubble);
        $this->producer = $producer;
    }
.....

मुझे त्रुटि मिली:

सेवा "App\Logger\AlertLogger" को ऑटोवायर नहीं कर सकता: "__construct ()" विधि के तर्क "$स्तर" का कोई प्रकार-संकेत नहीं है, आपको इसके मान को स्पष्ट रूप से कॉन्फ़िगर करना चाहिए।

0
Lucas 6 अक्टूबर 2018, 23:07

1 उत्तर

सबसे बढ़िया उत्तर

लुकास, अपने कंस्ट्रक्टर तर्कों को ओवरराइड करने के लिए आपको इसके लिए कस्टम कंस्ट्रक्टर को परिभाषित करना चाहिए और सेवा परिभाषा को कॉन्फ़िगर करना चाहिए (यदि ऑटोवायर्ड नहीं है)। दुर्भाग्य से इससे पूर्वनिर्धारित कार्यक्षमता का नुकसान होता है (यानी level सेटिंग यहां बेकार है), इसलिए आपको इसे स्वयं ही फिर से परिभाषित करना होगा।

यदि हैंडलर को सेवा के रूप में परिभाषित किया गया है तो यह वास्तव में किसी भी तरह से संसाधित नहीं होता है

https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/MonologExtension.php#L131-L135

आप उनके राज्य पर अधिक विशिष्ट उत्तर प्राप्त करने के लिए आपको कंस्ट्रक्टर और सेवा परिभाषा पोस्ट करने का प्रयास कर सकते हैं। पहली नज़र में मैं सुझाव दे सकता हूं कि आपने हाथ से सेवा परिभाषा बनाई है और @ चिह्न भूल गए हैं। सिर्फ एक अनुमान।

संपादित करें:

होना चाहिए

services:
    .....
    App\Logger\AlertLogger:
        arguments:
            $level: 'warning'
            $bubble: true
            $producer: "@OldSound\RabbitMqBundle\RabbitMq\Producer"

कंस्ट्रक्टर के साथ

/**
 * @var ProducerInterface
 */
private $producer;
public function __construct($level, $bubble, ProducerInterface $producer)
{
    parent::__construct($level, $bubble);
    $this->producer = $producer;
}
0
ScayTrase 12 अक्टूबर 2018, 14:57