为什么未记录控制台任务的错误。例如,php警告的例外:

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

我看到了在Stdout中打印的内容,但没有记录到日志。 (我在cron中使用控制台命令)。在网络中,这些异常记录在这种情况下,这比这种例外更具信息性。

作为解决方案:我将所有过程函数封闭在try..catch块中并手动记录回溯。

任何人都知道如何在控制台任务中启用或配置记录。我认为它一定在某个地方。

有帮助吗?

解决方案

当我遵循代码时,实际上没有这样的选项可以启用命令记录。在 app/console 是这个代码:

use Symfony\Bundle\FrameworkBundle\Console\Application;

...

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

它打电话 Symfony\Component\Console\Application::run() 其中有尝试/捕获块。关于异常方法 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);
}

其他提示

如果这是简单地了解出了什么问题的问题,您可以使用详细标志运行应用程序 -v 或者 --verbose, ,哪个会 自动打印异常跟踪 屏幕上。

tl; dr :只是使用 这个束

来自 食谱 :

为了使您的控制台应用程序自动记录所有命令的例外,您可以使用控制台事件。

创建一个标记为事件侦听器的服务 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);
    }
}

另一种方法是实施自己的自定义 OutputInterface 班级和覆盖 writeln 在那里记录错误的方法。然后执行新课程 run() 方法。

这样,您可以遵守 开/关闭原则 Symfony无需修改基础阶层而仍然实现您的目标。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top