获取 Monolog JSON 堆栈跟踪作为数组

Get Monolog JSON Stack Trace as Array

我正在使用 Laravel 4.2 并希望以 JSON 的身份注销。 Laravel 使用 Monolog,所以我已经像这样配置了 JSON 格式化程序:

$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 中跟踪自己单独的数组吗?

迟来的更新:

主要问题是 Laravel 以及许多遵循其示例的代码尝试自行记录异常,例如 Log::error($e)这是用 Monolog 记录异常的错误方法。 第一个参数应该是一个简单的消息字符串。在处理它时,Monolog\Logger::addRecord() 显式地将消息转换为字符串:

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

如果 $message 实际上是一个异常,您将获得整个堆栈跟踪作为一个字符串。不幸的是,这就是 Laravel 的 default exception handler does

将堆栈跟踪作为数组获取的正确方法是将异常作为上下文传递,以便格式化程序可以使用非字符串化的异常。例如:

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

您需要在 Laravel 的自定义异常处理程序中放入一些等效的内容,然后您可以使用适当的 JSON 格式化程序并获得您除外的内容。