如何在 laravel 控制台命令中显示异常跟踪?
How can I display Exception trace in laravel console command?
我正在使用 Laravel 5.1 创建一个基于控制台的应用程序。在开发过程中,我想在发生错误时显示异常跟踪。但是,即使我在 php artisan
中使用 -v -vv 或 -vvv 选项,我的自定义命令也不会得到异常跟踪。我在我的.env
中设置了APP_DEBUG=true
,仍然没有异常痕迹。
php artisan some:unknowncommand
的输出是:
[InvalidArgumentException]
There are no commands defined in the "some" namespace.
php artisan -v some:unknowncommand
的输出是:
[InvalidArgumentException]
There are no commands defined in the "some" namespace.
Exception trace:
() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501
Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535
Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192
Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126
...
现在,我创建了一个名为 dp:test 的非常简单的控制台命令,具有以下句柄函数:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
generate error here
}
php artisan dp:test
的输出是:
[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)
php artisan -v dp:test
的输出是一样的。
php artisan -vvv dp:test
的输出是一样的。
日志文件确实显示了异常跟踪,因此应该可以通过某种方式在 cli 中显示它。我什至没有看到发生错误的文件名和行号...我该如何处理?
提前致谢!
编辑:
进一步挖掘。如果我在我的命令中使用它:
public function handle()
{
throw new \Exception("test exception");
}
并且我发出命令 php artisan -v dp:test
,打印了错误跟踪。仅当由于 PHP 错误引发异常时才不打印跟踪。在 Illuminate/Foundation/Bootstrap/HandleExceptions.php
方法中 bootstrap
PHP 错误被转换为异常。发生这种情况时,会抛出异常,但在打印时会以某种方式忽略 -v。这非常不方便,因为它使调试 CLI 应用程序变得困难。
我认为可以在 vendor/symfony/console/Application.php
方法 renderException
中找到解决方案。
我稍后会深入挖掘,除非有人能比我更快地指出解决方案:-)
如果您查看 Illuminate\Console\Command
class,您将看到将错误字符串写入控制台的函数的定义:
/**
* Write a string as error output.
*
* @param string $string
* @return void
*/
public function error($string)
{
$this->output->writeln("<error>$string</error>");
}
现在你看到它只写了错误字符串,你可以稍微玩一下它来实现你想要的。您可以获得函数回调跟踪并向后输出任意数量的行和文件。只需创建扩展命令的 class,覆盖函数并使所有命令继承该命令 class:
/**
* Write a string as error output.
*
* @param string $string
* @return void
*/
public function error($string)
{
$this->output->writeln("<error>$string</error>");
$trace = debug_backtrace();
foreach ($trace as $t)
{
$this->output->writeln("Trace : " . $t['file'] . " on line " . $t['line'] . " function " . $t['function']);
}
}
我找到了 -v 被忽略的原因:
在 Illuminate/Foundation/Bootstrap/HandleExceptions.php
中,renderForConsole
方法使用默认设置实例化一个 ConsoleOutput
对象,不考虑用户要求的详细设置:
protected function renderForConsole($e)
{
$this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
}
因此,无论设置 -v -vv 或 -vvv,vendor/symfony/console/Application.php
中的 $output->getVerbosity()
始终低于 OutputInterface::VERBOSITY_VERBOSE
,因此,堆栈跟踪是未打印。
我可能会为此在 github 上发起一个问题,因为我认为如果用户设置 -v 时在 CLI 中显示错误会更方便。
您可以通过添加以下 use 语句将详细程度设置为您想要的任何级别:
use Symfony\Component\Console\Output\OutputInterface;
然后将其添加到句柄函数的顶部:
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
在此处查看 symfony 控制台的文档 http://symfony.com/doc/current/console/verbosity.html
获取更多信息。
我正在使用 Laravel 5.1 创建一个基于控制台的应用程序。在开发过程中,我想在发生错误时显示异常跟踪。但是,即使我在 php artisan
中使用 -v -vv 或 -vvv 选项,我的自定义命令也不会得到异常跟踪。我在我的.env
中设置了APP_DEBUG=true
,仍然没有异常痕迹。
php artisan some:unknowncommand
的输出是:
[InvalidArgumentException]
There are no commands defined in the "some" namespace.
php artisan -v some:unknowncommand
的输出是:
[InvalidArgumentException]
There are no commands defined in the "some" namespace.
Exception trace:
() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501
Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535
Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192
Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126
...
现在,我创建了一个名为 dp:test 的非常简单的控制台命令,具有以下句柄函数:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
generate error here
}
php artisan dp:test
的输出是:
[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)
php artisan -v dp:test
的输出是一样的。
php artisan -vvv dp:test
的输出是一样的。
日志文件确实显示了异常跟踪,因此应该可以通过某种方式在 cli 中显示它。我什至没有看到发生错误的文件名和行号...我该如何处理?
提前致谢!
编辑:
进一步挖掘。如果我在我的命令中使用它:
public function handle()
{
throw new \Exception("test exception");
}
并且我发出命令 php artisan -v dp:test
,打印了错误跟踪。仅当由于 PHP 错误引发异常时才不打印跟踪。在 Illuminate/Foundation/Bootstrap/HandleExceptions.php
方法中 bootstrap
PHP 错误被转换为异常。发生这种情况时,会抛出异常,但在打印时会以某种方式忽略 -v。这非常不方便,因为它使调试 CLI 应用程序变得困难。
我认为可以在 vendor/symfony/console/Application.php
方法 renderException
中找到解决方案。
我稍后会深入挖掘,除非有人能比我更快地指出解决方案:-)
如果您查看 Illuminate\Console\Command
class,您将看到将错误字符串写入控制台的函数的定义:
/**
* Write a string as error output.
*
* @param string $string
* @return void
*/
public function error($string)
{
$this->output->writeln("<error>$string</error>");
}
现在你看到它只写了错误字符串,你可以稍微玩一下它来实现你想要的。您可以获得函数回调跟踪并向后输出任意数量的行和文件。只需创建扩展命令的 class,覆盖函数并使所有命令继承该命令 class:
/**
* Write a string as error output.
*
* @param string $string
* @return void
*/
public function error($string)
{
$this->output->writeln("<error>$string</error>");
$trace = debug_backtrace();
foreach ($trace as $t)
{
$this->output->writeln("Trace : " . $t['file'] . " on line " . $t['line'] . " function " . $t['function']);
}
}
我找到了 -v 被忽略的原因:
在 Illuminate/Foundation/Bootstrap/HandleExceptions.php
中,renderForConsole
方法使用默认设置实例化一个 ConsoleOutput
对象,不考虑用户要求的详细设置:
protected function renderForConsole($e)
{
$this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
}
因此,无论设置 -v -vv 或 -vvv,vendor/symfony/console/Application.php
中的 $output->getVerbosity()
始终低于 OutputInterface::VERBOSITY_VERBOSE
,因此,堆栈跟踪是未打印。
我可能会为此在 github 上发起一个问题,因为我认为如果用户设置 -v 时在 CLI 中显示错误会更方便。
您可以通过添加以下 use 语句将详细程度设置为您想要的任何级别:
use Symfony\Component\Console\Output\OutputInterface;
然后将其添加到句柄函数的顶部:
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
在此处查看 symfony 控制台的文档 http://symfony.com/doc/current/console/verbosity.html 获取更多信息。