Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2在控制台中记录异常_Php_Logging_Symfony_Console Application_Error Logging - Fatal编程技术网

Php Symfony 2在控制台中记录异常

Php Symfony 2在控制台中记录异常,php,logging,symfony,console-application,error-logging,Php,Logging,Symfony,Console Application,Error Logging,为什么不记录控制台任务中的错误。 例如,php异常警告: [ErrorException] 注意:未定义的偏移量:1 in/var/www/project/vendor/doctrine/lib/doctrine/ORM/Query.php第298行 我看到了打印在标准输出中的内容,但没有记录到日志中。(我在cron中使用控制台命令)。 在web中,这些异常是通过回溯记录的,在这种情况下,回溯比此异常更具信息性 作为解决方案:我将所有进程函数封装在try..catch块中,并手动记录回溯 是否有

为什么不记录控制台任务中的错误。 例如,php异常警告:

[ErrorException]
注意:未定义的偏移量:1 in/var/www/project/vendor/doctrine/lib/doctrine/ORM/Query.php第298行

我看到了打印在标准输出中的内容,但没有记录到日志中。(我在cron中使用控制台命令)。 在web中,这些异常是通过回溯记录的,在这种情况下,回溯比此异常更具信息性

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

是否有人知道如何启用或配置登录控制台任务。
我想它一定在某个地方。

当我遵循代码时,实际上没有这样的选项来启用命令的日志记录。在
app/console
中,此代码是:

use Symfony\Bundle\FrameworkBundle\Console\Application;

...

$application = new Application($kernel);
$application->run();
它调用
Symfony\Component\Console\Application::run()
,其中有try/catch块。在异常情况下,调用了方法
renderException()
,但在任何地方都不会发生日志记录

还请注意,
app/console
在默认情况下总是以异常错误代码退出

您可以创建自己的
应用程序
类扩展
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);
}

另一种方法是实现自己的自定义
OutputInterface
类,并重写
writeln
方法来记录错误。然后在执行
run()
方法时使用新类


通过这种方式,您可以遵守Symfony的规则,而不必修改基类,并且仍然可以实现您的目标。

TL;DR:只需使用

从:

要使控制台应用程序自动记录所有命令的未捕获异常,可以使用控制台事件

控制台创建标记为事件侦听器的服务。异常
事件:

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

如果只是简单了解哪里出了问题,您可以使用屏幕上显示的verbose标志
-v
--verbose
运行应用程序


谢谢您的解释。我深入研究了LaunchFilesConsole&index.php,但应该深入研究应用程序类。但是web&console中的应用程序类似乎共享相同的行为。对于
setCatchExceptions
,是的。在较新的php版本上,可以通过
Throwable
而不是
Exception
来改进此示例:是的,因为Symfony 2.3,这是一个更好的解决方案。您是对的,但问题是关于将错误写入日志(例如,在文件中),当我从cron运行cli命令时,这是必要的。很抱歉,错过了cron部分。不知道如何在不使问题复杂化的情况下进行回溯,决定与大家分享研究结果。@IanBytchek,无论如何,谢谢你,你的回答对我帮助很大!