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

时间:2015-06-02 21:33:10

标签: php laravel monolog

我使用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中跟踪它自己独立的数组吗?

1 个答案:

答案 0 :(得分:3)

漫长的更新:

主要问题是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格式化程序来获得你的内容。