2011-10-10 12 views
15

इस cookbook article में, हम देख सकते हैं कि किसी सेवा में कस्टम चैनल का उपयोग कैसे करें। लेकिन मैं एक कमांड में कस्टम लॉगिन चैनल का उपयोग कैसे कर सकता हूं?symfony2 कमांड में कस्टम मोनोलॉग लॉगिंग चैनल

मैंने कुछ करने के लिए symfony2 कमांड बनाया है। मैं अपने आदेश द्वारा की गई चीजों को लॉग करने के लिए मोनोलॉग का उपयोग करना चाहता हूं।

दरअसल, मैं एप्लिकेशन के लॉग की तुलना में किसी अन्य फ़ाइल में अपने आदेश के लिए लॉग लिखना चाहता हूं।

+0

मैं यह जानना चाहता हूं कि यह कैसे करें – HappyDeveloper

+2

उत्तर में http://stackoverflow.com/questions/8169114/how-to-write-logs-from-one-service-into-separate-file/8210892#8210892 – Seldaek

+0

धन्यवाद, मैंने इस लिंक के साथ अपने प्रश्न का उत्तर दिया। – Reuven

उत्तर

0

ज्यादातर मामलों में, आपका आदेश कंटेनरवेयरवेयर को बढ़ाता है (जैसा कि यहां देखा गया है: http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command)।

इसका मतलब है कि आपके आदेश में सिम्फनी के सेवा कंटेनर तक पहुंच है - जो सिम्फनी (यानी उपयोगी वस्तुओं) के अंदर सभी सेवाओं का एक बड़ा बैग है।

$logger = $this->getContainer()->get('logger'); 

(संदर्भ: http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container)

अब आप सामान्य रूप में लकड़हारा उपयोग कर सकते हैं आपके मामले में, आप logger सेवा है, जो आपको यह कंटेनर से बाहर हथियाने से प्राप्त कर सकते हैं की जरूरत है। अगर आपको कभी भी किसी अन्य सेवाओं की ज़रूरत है, तो बस php app/console container:debug कमांड देखें, जो कंटेनर पर हर एक सेवा सूचीबद्ध करता है।

शुभकामनाएं!

+1

आपके उत्तर के लिए धन्यवाद। मुझे पता है कि लॉगर का उपयोग कैसे करें। मैं जानना चाहता हूं कि मैं इस लॉगर के लिए कस्टम चैनल का उपयोग कैसे कर सकता हूं। मैं अपने आदेश के परिणामों को किसी अन्य फ़ाइल में लॉग करना चाहता हूं। – Reuven

+0

अच्छा सवाल। किसी को जवाब पता है? –

6

कि ContainerAwareCommand फैली हुई है, Symfony की सेवा कंटेनर की पहुंच है किसी भी कस्टम आदेश। आप अपनी कॉन्फ़िगरेशन में कस्टम चैनल में लॉग इन करने वाली सेवा को परिभाषित कर सकते हैं।

<services> 
    <service id="console.logger" parent="monolog.logger_prototype"> 
     <argument index="0">mychannel</argument> 
    </service> 
</services> 

आप निम्नलिखित तरीके

$logger = $this->getContainer()->get('console.logger'); 

यह लकड़हारा "mychannel" के रूप में चैनल के साथ प्रवेश करेंगे आदेश से अपनी सेवा का उपयोग कर सकते हैं।

FYI डिफ़ॉल्ट लॉगर सेवा चैनल "ऐप" पर लॉग इन करता है। इसे फ़ाइल Symfony/Bundle/MonologBundle/Resources/config/monolog.xml में देखा जा सकता है। यह वह जगह भी है जहां डिफ़ॉल्ट logger सेवा परिभाषित की गई है।

<services> 
    <service id="monolog.logger" parent="monolog.logger_prototype" public="false"> 
     <argument index="0">app</argument> 
    </service> 

    <service id="logger" alias="monolog.logger" /> 

    <service id="monolog.logger_prototype" class="%monolog.logger.class%" abstract="true"> 
     <argument /><!-- Channel --> 
    </service> 
</services> 
4

इस प्रयास करें, पुस्तकालय सीधे

use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 

// ... 

// create a log channel 
$log = new Logger('name'); 
$log->pushHandler(new StreamHandler('path of log file', Logger::WARNING)); 

//add the erros to log file 

try { 
    //do something 
} catch(Exception $e) { 
    $log->addError($e->getMessage()); 
} 

का उपयोग हो सकता है कि यह आपकी समस्या का समाधान कर सकते हैं, अपने आदेश फाइल में इस जोड़ें।

0

Symfony 3.3 के लिए क्योंकि autowire सेवाओं की आप लॉग इन करने के अलग फ़ाइलों इस दृष्टिकोण का पालन पर चाहते हैं जब:

उदाहरण के लिए हमें लगता है कि हम 2 घूर्णन फ़ाइलों पर लॉग ऑन करने की जरूरत है:

  • exception.log: के लिए आवेदन में अपवाद।
  • dataFetch.log: एपीआई के लिए कॉल के लिए एप्लिकेशन डेटा पुनर्प्राप्त करता है।

services.yml पुट द:

monolog: 
    channels: ['dataFetch', 'exception'] 

    handlers: 

    dataFetch: 
    type: 'rotating_file' 
    level: info 
    type: stream 
    path: 'dataFetch.log' 
    max_files: 7 
    channels: dataFetch 

    exception: 
     type: 'rotating_file' 
     level: error 
     type: stream 
     path: 'exception.log' 
     max_files: 7 
     channels: exception 

अब अपवाद loger के लिए आप निर्भरता monolog.logger.exception जबकि विज्ञापन dataFetch के लिए आप monolog.logger.dataFetch इंजेक्षन निर्भरता सकते हैं इंजेक्षन कर सकते हैं।

संबंधित मुद्दे