我的 api 有问题,我的 api 连接到不同的外部 api,它使用 guzzle 发出请求,我希望为这些外部 api 显示的每 500 个状态错误都是可报告的,因此我可以使用哨兵发送警报,我有这个代码:
app\Exceptions\Handler.php
public function register()
{
$this->reportable(function (Throwable $e) {
///dd('is reportable');
if (app()->bound('sentry') && config('app.env') === 'production') {
app('sentry')->captureException($e);
}
});
}
在我的本地环境中,.env 文件设置如下:
APP_NAME=App
APP_ENV=production
APP_KEY=base64:lkjslkdjflkjlksdfb5uk=
APP_DEBUG=true
APP_URL=http://localhost
....
我这样做是为了进行一些测试,看看一切是否正常,但它不起作用。 我禁用了 mysql,并且能够触发警报,但我想针对这些 api 返回的所有 500 个错误触发警报。例如,如果我使用 guzzle 向外部服务器发出请求,它会收到此 500 状态错误:
{
"message": "SOAP-ERROR: Parsing WSDL: Couldn't load from 'https:\/\/invalid url' : failed to load external entity \"https:\/\/invalid\"\n",
"exception": "SoapFault",
"file": "/path/file.php",
"line": 100,
"trace": [
{
我应该能够触发警报,但我注意到没有进入此方法
$this->reportable(
我能做什么?
在 Laravel 中,所有异常都会通过一个文件,可以在此处找到:app/Exceptions/Handler.php。
public function register()
{
$this->reportable(function (Throwable $e) {
Log::info($e->getMessage());
});
}
将在 storage/logs/laravel.log 中创建一个新日志,其中包含以下消息
看起来像这样
[2022-08-03 08:07:56] local.INFO: Undefined variable $variableMissing
使用 Honeybadger 进行有用的错误记录
安装 Honeybadger 非常简单,因此请前往 Honeybadger Laravel 文档并按照分步指南进行安装。您会注意到,您需要做的就是安装 Composer 依赖项并设置可报告的回调:
public function register()
{
$this->reportable(function (Throwable $e) {
if (app()->bound('honeybadger')) {
app('honeybadger')->notify($e, app('request'));
}
});
}
安装 Honeybadger Composer 依赖项后,运行以下命令:
php artisan honeybadger:install your-project-api-key
Laravel 现在会将所有错误数据发送到 Honeybadger,而不是日志文件,这更容易、更清晰地使用。
创建自定义异常
回顾一下,我们已经展示了 Laravel 中什么被视为错误、如何编辑默认页面以及如何挂钩引发的异常。但是,让我们更进一步本教程并构建自定义异常。
自定义异常可用于多种目的。我发现最有用的是为我需要研究的应用程序区域提供上下文。对于这个简单的用例和演示目的,我们将异常命名为 FailedToLoadHomePage ,如果我们因任何原因无法渲染主页视图,则触发此异常。
启动该终端,让我们开始吧:
php artisan make: exception FailedToLoadHomePage
这将为我们创建一个新类app/Exceptions/FailedToLoadHomePage.php,该类包含以下样板:
<?php
namespace App\Exceptions;
use Exception;
class FailedToLoadHomePage extends Exception
{
//
}
现在我们要做的是返回到我们的路由文件并在出现问题时抛出此异常。
Route::get('/', function () {
try {
return view('welcome', [
'data' => $variableMissing
]);
} catch (Throwable $exception) {
throw new FailedToLoadHomePage($exception->getMessage());
}
});