Frage

Warum Fehler von Konsolenaufgaben nicht protokolliert werden. Zum Beispiel Ausnahme zur PHP -Warnung:

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

Ich sehe, was in Stdout gedruckt wurde, aber nichts, was sich an Protokollen angemeldet hat. (Ich verwende Konsolenbefehle in Cron). Im Web sind diese Ausnahmen mit Backtrace protokolliert, was in dieser Situation mehr informativ ist als nur diese Ausnahme.

Als Lösung: Ich habe die gesamte Prozessfunktion in Try.. ein und protokolle die Backtrace manuell.

Weiß jemand, wie man die Protokollierung in Konsolenaufgaben aktiviert oder konfiguriert? Ich denke, es muss irgendwo sein.

War es hilfreich?

Lösung

Als ich dem Code folgte, gibt es tatsächlich keine solche Option, um die Protokollierung für Befehle zu aktivieren. Im app/console ist dieser Code:

use Symfony\Bundle\FrameworkBundle\Console\Application;

...

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

Es ruft Symfony\Component\Console\Application::run() in dem es Versuch/Fangblock gibt. Auf Ausnahmemethode renderException() wird genannt, aber nirgendwo findet keine Protokollierung statt.

Beachten Sie auch das app/console Immer standardmäßig beendet sich die Ausnahme mit Fehlercode.

Sie können Sie besitzen Application Klasse Ausdehnung Symfony\Bundle\FrameworkBundle\Console\Application und ändern app/console um es zu benutzen. Als Sie überschreiben können run() Methode und fügen Sie Fehler auf, die Protokollierung fügen.

Oder Sie können gerade ändern app/console und umgehen Sie mit solchen Fehlern:

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

Andere Tipps

Wenn dies einfach zu verstehen ist, was dort schief gelaufen ist, können Sie Ihre App mit der ausführlichen Flagge ausführen -v oder --verbose, welches wird Drucken Sie die Ausnahmeverfolgung automatisch aus auf dem Bildschirm.

Tl; dr : benutz einfach Dieses Bündel

Von dem Kochbuch :

Damit Ihre Konsolenanwendung automatisch unbekannte Ausnahmen für alle Ihre Befehle protokolliert hat, können Sie Konsolenereignisse verwenden.

Erstellen Sie einen Dienst als Event -Hörer für die console.exception Veranstaltung :

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

Sie können jetzt alles tun, was Sie wollen, mit Konsolenausnahmen:

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

Eine andere Möglichkeit besteht darin, Ihren eigenen Brauch zu implementieren OutputInterface Klasse und überschreiben die writeln Methode, um den Fehler dort zu protokollieren. Verwenden Sie dann die neue Klasse, wenn Sie die ausführen run() Methode.

Auf diese Weise können Sie sich an die halten Open/Close -Prinzip von Symfony, ohne die Basisklassen ändern zu müssen und dennoch Ihre Ziele zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top