Получить трассировку стека Monolog JSON в виде массива


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

$logHandler = new MonologHandlerStreamHandler(Config::get('app.logFile'), MonologLogger::DEBUG);
$logHandler->setFormatter(new MonologFormatterJsonFormatter);
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:388nStack trace:n#0 /var/www/vendor/clue/socket-raw/So..."
}

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

1 2

1 ответ:

Давно назревшее обновление:

Основная проблема заключается в том, что Laravel и множество кода, следующих его примеру, пытаются зарегистрировать исключение самостоятельно, например, Log::error($e). это неправильный способ регистрации исключения с помощью Monolog. этот первый параметр должен быть простой строкой сообщения. При его обработке Monolog\Logger::addRecord() явно приводит сообщение к строке:
$record = array(
    'message' => (string) $message,
    //...
);

Если $message на самом деле является исключением, вы получаете всю трассировку стека в виде строки. К сожалению, это то, что у Ларавеля обработчик исключений по умолчанию делает .

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

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

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