Pregunta

Por qué no se registran los errores de las tareas de la consola. Por ejemplo, excepción en la advertencia de PHP:

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

Veo lo que impreso en Stdout, pero nada registrado para registros. (Uso comandos de consola en Cron). En la web, estas excepciones iniciaron sesión con Backtrace, que en esta situación es más informativo que solo esta excepción.

Como solución: adjunto toda la función de proceso en prueba ... bloque de captura y registro el camino de retroceso manualmente.

¿Alguien sabe cómo habilitar o configurar el registro en tareas de consola? Creo que debe estar en alguna parte.

¿Fue útil?

Solución

Mientras seguí el código, en realidad no hay tal opción para habilitar el registro de comandos. En app/console es este código:

use Symfony\Bundle\FrameworkBundle\Console\Application;

...

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

Llama Symfony\Component\Console\Application::run() en el que hay un bloque de tráfico/captura. Sobre el método de excepción renderException() se llama, pero no ocurre el registro en ningún lado.

También tenga en cuenta que app/console Siempre sale de forma predeterminada con código de error en la excepción.

Puedes crear tu propio Application Extensión de la clase Symfony\Bundle\FrameworkBundle\Console\Application y modificar app/console para usarlo. De lo que puedes anular run() método y agregar registro de errores.

O puedes modificar solo app/console y manejar erros como este:

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

Otros consejos

Si esa es la cuestión de simplemente entender lo que salió mal en dónde, puede ejecutar su aplicación con la bandera detallada -v o --verbose, que lo hará Imprima automáticamente el rastro de excepción en la pantalla.

Tl; Dr : Solo usa este paquete

Desde el libro de cocina :

Para que su aplicación de consola registre automáticamente las excepciones no capturas para todos sus comandos, puede usar eventos de consola.

Cree un servicio etiquetado como oyente de eventos para el console.exception evento :

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

Ahora puede hacer lo que quiera con excepciones de consola:

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

Otra forma es implementar su propia personalización. OutputInterface clase y anular el writeln Método para registrar el error allí. Luego use la nueva clase cuando ejecute el run() método.

De esta manera puedes adherirte al Principio abierto/cerrado de Symfony sin tener que modificar las clases base y aún así lograr sus objetivos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top