获取 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 格式化程序并获得您除外的内容。
我正在使用 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 格式化程序并获得您除外的内容。