(Laravel 5.8) Как получить уровень многословия в классе Exception Handler - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь получить уровень многословия ВНУТРИ класса обработчика исключений, чтобы я мог печатать больше или меньше информации.

Я пишу пакетный сценарий, который выполняется на сотнях тысяч циклов и поэтому мойцель состоит в том, чтобы ограничить многословность трассировки стека, поскольку в этом случае единственными полезными трассировками являются последние 3 или 4.

Я пробовал некоторые другие ответы, приведенные здесь в SO, и читал по всему Интернету,но никто из них не говорит о работе внутри обработчика исключений.Тот, который выглядит ближе: этот ответ , в котором говорится $this->getOutput()->getVerbosity();, но он не работает внутри обработчика ошибок.

Это мой код:

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

use Mail;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;
use App\Mail\ExceptionOccured;
use Illuminate\Support\Facades\Log;
use Symfony\Component\Console\Output\OutputInterface;

class Handler extends ExceptionHandler 
...
...
public function render($request, Exception $e)
    {
        // return parent::render($request, $e);
        Log::error($this->buildMessage($e));
    }


    public function buildMessage($e) 
    {
        $verbosity_level = $this->getOutput()->getVerbosity();
        $is_verbose = ($verbosity_level >= OutputInterface::VERBOSITY_DEBUG);

        $t0 = $e->getTrace()[0];
        $tm = "Error: [{$e->getCode()}] {$e->getMessage()} @ {$t0['file']}:{$t0['line']}".PHP_EOL;
        // if ($is_verbose){
            ...(more code) ...
        // }
        return $tm;
    }
}

И это вывод:

PHP Fatal error:  
Uncaught Error: Call to undefined method App\Exceptions\Handler::getOutput() in ...\Handler.php:89

Я видел, что свойство output существует, но оно защищено и не имеет получателя.Возможно, цитируемый ответ действителен для более ранних версий.Я действительно заблудился, так как у меня всего 2 месяца игры с Laravel.

1 Ответ

0 голосов
/ 02 июня 2019

В обработчике исключений есть специальный метод для консоли: renderForConsole().

/**
 * Render an exception to the console.
 *
 * @param  \Symfony\Component\Console\Output\OutputInterface  $output
 * @param  \Exception  $e
 * @return void
 */
public function renderForConsole($output, Exception $e)
{
    (new ConsoleApplication)->renderException($e, $output);
}

Это довольно простая оболочка для обработчика исключений по умолчанию компонента Symfony Console. Настройте под свои нужды!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...