2012-02-16 26 views
11

कंसोल कार्यों से त्रुटियां लॉग क्यों नहीं हैं। उदाहरण के लिए php चेतावनी पर अपवाद:सिम्फनी 2 कंसोल में लॉगिंग अपवाद

[ErrorException]
Notice: Undefined offset: 1 in /var/www/project/vendor/doctrine/lib/Doctrine/ORM/Query.php line 298

मैं क्या stdout में मुद्रित, लेकिन कुछ भी लॉग में लॉग देखें। (मैं क्रॉन में कंसोल कमांड का उपयोग करता हूं)। वेब में इन अपवादों को बैकट्रैक के साथ लॉग किया गया है, जो इस स्थिति में केवल इस अपवाद से अधिक जानकारीपूर्ण है।

एक समाधान के रूप में: मैं कोशिश करता हूं कि सभी प्रक्रिया फ़ंक्शन को .. कैच ब्लॉक में संलग्न करें और मैन्युअल रूप से बैकट्रैक लॉग करें।

क्या कोई जानता है कि कंसोल कार्यों में लॉगिंग को सक्षम या कॉन्फ़िगर कैसे करें। मुझे लगता है कि यह कहीं होना चाहिए।

उत्तर

14

जैसा कि मैंने कोड का पालन किया है, वास्तव में आदेशों के लिए लॉगिंग सक्षम करने के लिए ऐसा कोई विकल्प नहीं है।

use Symfony\Bundle\FrameworkBundle\Console\Application; 

... 

$application = new Application($kernel); 
$application->run(); 

यह कहता है Symfony\Component\Console\Application::run() जिसमें वहाँ/कैच ब्लॉक की कोशिश: app/console में इस कोड है। अपवाद विधि renderException() पर कॉल किया जाता है, लेकिन कहीं भी लॉगिंग नहीं होती है।

यह भी ध्यान दें कि app/console डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से अपवाद पर त्रुटि कोड के साथ बाहर निकलता है।

आप Application कक्षा Symfony\Bundle\FrameworkBundle\Console\Application विस्तारित कर सकते हैं और इसका उपयोग करने के लिए app/console संशोधित कर सकते हैं। आप run() विधि को ओवरराइड कर सकते हैं और त्रुटियों को लॉगिंग जोड़ सकते हैं।

या फिर आप app/console को संशोधित करने और संभाल कर सकते हैं मिली त्रुटियाँ इस तरह:

// $application->run(); 
$application->setCatchExceptions(false); 
try { 
    $output = new Symfony\Component\Console\Output\ConsoleOutput(); 
    $application->run(null, $output); 
} catch (Exception $e) { 
    ... error logging ... 

    $application->renderException($e, $output); 

    $statusCode = $e->getCode(); 
    $statusCode = is_numeric($statusCode) && $statusCode ? $statusCode : 1; 
    exit($statusCode); 
} 
+0

स्पष्टीकरण के लिए धन्यवाद। मैं लॉन्च फाइल कंसोल और index.php में खोदता हूं लेकिन आवेदन कक्षा में गहरी खुदाई करनी चाहिए। लेकिन ऐसा लगता है कि वेब और कंसोल में एप्लिकेशन क्लासेस समान व्यवहार साझा करते हैं। – Sawered

2

एक और तरीका है अपने स्वयं के कस्टम OutputInterface वर्ग को लागू करने और वहाँ त्रुटि लॉग इन करने के writeln विधि ओवरराइड करने के लिए है। फिर जब आप run() विधि निष्पादित करते हैं तो नई कक्षा का उपयोग करें।

इस तरह आप बेस क्लास को संशोधित किए बिना सिम्फनी के Open/Close Principle का पालन कर सकते हैं और फिर भी अपने लक्ष्यों को प्राप्त कर सकते हैं।

6

टी एल; डॉ: सिर्फ this bundle

का उपयोग cookbook से:

अपने कंसोल आवेदन स्वचालित रूप से अपने आदेशों में से सभी के लिए ध्यान में न आया अपवाद लॉग इन करने के लिए, आप कंसोल घटनाओं का उपयोग कर सकते हैं।

एक सेवा console.exception घटना के लिए एक घटना श्रोता के रूप में चिह्नित बनाएँ:

# services.yml 
services: 
    kernel.listener.command_dispatch: 
    class: Acme\DemoBundle\EventListener\ConsoleExceptionListener 
    arguments: 
     logger: "@logger" 
    tags: 
     - { name: kernel.event_listener, event: console.exception } 

अब आप क्या कर सकते हैं जो कुछ भी आप कंसोल अपवादों के साथ हैं:

<?php 
// src/Acme/DemoBundle/EventListener/ConsoleExceptionListener.php 
namespace Acme\DemoBundle\EventListener; 

use Symfony\Component\Console\Event\ConsoleExceptionEvent; 
use Psr\Log\LoggerInterface; 

class ConsoleExceptionListener 
{ 
    private $logger; 

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

    public function onConsoleException(ConsoleExceptionEvent $event) 
    { 
    $command = $event->getCommand(); 
    $exception = $event->getException(); 

    $message = sprintf(
     '%s: %s (uncaught exception) at %s line %s while running console command `%s`', 
     get_class($exception), 
     $exception->getMessage(), 
     $exception->getFile(), 
     $exception->getLine(), 
     $command->getName() 
    ); 

    $this->logger->error($message); 
    } 
} 
+0

हां, सिम्फनी 2.3 के बाद से यह एक बेहतर समाधान है। – Martin

6

हैं कि बस की बात है यह समझना कि क्या गलत हो गया है, आप वर्बोज़ फ्लैग -v या --verbose के साथ अपना ऐप चला सकते हैं, जो स्क्रीन पर automatically print the exception trace होगा।

+0

आप सही हैं, लेकिन सवाल लॉग इन करने के लिए त्रुटियों को लिखने के बारे में था (फ़ाइल में पूर्व में) जब मैं cron – Sawered

+0

से क्ली कमांड चलाता हूं तो यह आवश्यक था, क्षमा करें, क्रॉन भाग को याद किया। यह पता नहीं लगा सका कि बिना किसी जटिलता के बैकट्रैक कैसे प्राप्त करें, निष्कर्षों को साझा करने का फैसला किया। –

+1

@IanBytchek, वैसे भी धन्यवाद, आपके उत्तर ने मुझे बहुत मदद की! –