2015-06-02 3 views
2

Я использую Laravel 4.2 и хочу, чтобы выходить из системы как JSON. Laravel использует монолога, поэтому я настроен форматировщик JSON следующим образом:Получить Monolog JSON Stack Trace as Array

$logHandler = new Monolog\Handler\StreamHandler(Config::get('app.logFile'), Monolog\Logger::DEBUG); 
$logHandler->setFormatter(new Monolog\Formatter\JsonFormatter); 
Log::getMonolog()->pushHandler($logHandler); 

Проблема заключается в том, что стек следов включены как часть строки сообщения, например, так:

{ 
    "message": "exception 'Exception' with message 'Socket operation failed: Host name lookup failure' in /var/www/vendor/clue/socket-raw/Socket/Raw/Socket.php:388\nStack trace:\n#0 /var/www/vendor/clue/socket-raw/So..." 
} 

Может кто-то момент я в правильном направлении, чтобы стек трассировал свой отдельный массив в json?

+0

Похоже, это был добавлен в качестве признака в последние фиксации: https://github.com/phansys/monolog/blob/e8e1d9efa3df4ae5456bdb417d721a5a3e613c6b/src/Monolog/Formatter/JsonFormatter.php –

+0

О, круто! С тех пор я написал собственный JsonFormatter, который выглядит замечательно, как то, что они добавили. С Laravel, в частности, есть более активное участие, поэтому когда-нибудь я опубликую то, что я закончил. – jchamberlain

ответ

2

Давно пора обновление:

Основная проблема заключается в том, что Laravel, и много коды после его примера, пытается войти в исключение самого по себе, например, Log::error($e). Это неправильный способ регистрации исключения с помощью Monolog. Этот первый параметр должен быть простой строкой сообщения. При обработке его, Monolog\Logger::addRecord() явно бросает сообщение в строку:

$record = array(
    'message' => (string) $message, 
    //... 
); 

Если $message на самом деле исключение, вы получаете всю трассировку стеки в виде строки. К сожалению, это то, что Laravel's default exception handler does.

Правильный способ получить трассировку стека в качестве массива - передать исключение в качестве контекста, чтобы он не был привязан к форматированию. Например:

Log::error($e->getMessage(), ['exception' => $e]); 

Что-то эквивалент того, что вам нужно поместить в пользовательский обработчик исключений для Laravel, а затем вы можете использовать правильный формат JSON форматировщик и получить то, что вы за исключением.