Получить трассировку стека 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 ответ:
Давно назревшее обновление:
Основная проблема заключается в том, что Laravel и множество кода, следующих его примеру, пытаются зарегистрировать исключение самостоятельно, например,Log::error($e)
. это неправильный способ регистрации исключения с помощью Monolog. этот первый параметр должен быть простой строкой сообщения. При его обработкеMonolog\Logger::addRecord()
явно приводит сообщение к строке:$record = array( 'message' => (string) $message, //... );
Если
$message
на самом деле является исключением, вы получаете всю трассировку стека в виде строки. К сожалению, это то, что у Ларавеля обработчик исключений по умолчанию делает .Правильный способ получить трассировку стека в виде массива-передать исключение в качестве контекста, чтобы оно было доступно для форматирования без строки. Например:
Log::error($e->getMessage(), ['exception' => $e]);
Что-то эквивалентное-это то, что вам нужно поместить в пользовательский обработчик исключений для Laravel, а затем вы можете использовать правильный формататор JSON и получить то, что вы исключаете.