morrislaptop / error-tracker-adapter
通过最流行的SaaS平台跟踪错误和异常
Requires
- psr/log: ~1.0
Requires (Dev)
- bugsnag/bugsnag: ~2.5
- dbtlr/php-airbrake: dev-fix-params
- monolog/monolog: ~1.12
- php-vcr/php-vcr: ^1.2.1
- php-vcr/phpunit-testlistener-vcr: ~1.1
- phpspec/phpspec: ~2.1
- phpunit/phpunit: ~4.5
- raven/raven: 0.10.*
- squizlabs/php_codesniffer: ~2.2
This package is auto-updated.
Last update: 2024-08-26 03:40:51 UTC
README
通过最流行的SaaS平台跟踪错误和异常。
错误跟踪适配器是一个PHP库,它通过提供一个强大的抽象层来帮助您通过错误跟踪SaaS平台和/或本地存储库(如电子邮件和日志文件)跟踪应用程序中的异常和错误。
该库基于以下三个主要原则
- 编写接口而不是实现
- 保护应用程序免受第三方API中断
- 能够使用链或网状报告,以提高报告冗余和/或错误报告的可靠性
架构
SaaS平台
SaaS平台通过适配器支持,目前支持的平台有
- Sentry 通过 raven/raven
- Bugsnag 通过 bugsnag/bugsnag
- AirBrake 通过 dbltr/php-airbrake
- Rollbar 通过 rollbar/rollbar
- Exceptiontrap 通过 exceptiontrap/exceptiontrap
- Raygun 通过 mindscape/raygun4php
- Bugify
本地存储库
通过使用提供者支持本地存储库,如电子邮件、日志或数据库,目前支持的存储库有
- 通过 error-tracker-adapter-email 使用电子邮件报告器
- 日志报告器
如果您使用 Monolog,现在您可以将异常记录到其任何处理器中 - Pushover通知、HipChat、Flowdock、Slack等。
$monolog = new Monolog\Logger(); $monolog->pushHandler(new FlowdockHandler('apiToken', Monolog\Logger::ERROR)); $logger = new Morrislaptop\ErrorTracker\Provider\Log($monolog);
分组跟踪器
此外,您还可以使用分组跟踪器,它可以使用多种跟踪器以不同的方式工作
- 链报告器,用于在成功之前报告(例如,如果Sentry失败,则回退到日志记录)
- 网报告器,用于向所有跟踪器报告(例如,记录并报告到Sentry以提高冗余)
扩展功能
您可以通过实现 Tracker
接口来编写自己的提供者或适配器。您还可以选择使用其他接口 Adapter
、Provider
或 Group
,并/或扩展抽象类 AbstractAdapter
、AbstractProvider
或 AbstractGroup
,以帮助分类您的跟踪器。
安装
推荐的方式是通过 Composer 进行安装
$ composer require morrislaptop/error-tracker-adapter
快速开始
为了方便起见,库中包含了一个通用的异常处理器,您可以快速开始,只需创建它并调用 bootstrap()
方法即可。
$tracker = new Morrislaptop\ErrorTracker\Adapter\Sentry(new Raven_Client('https://blah.com')); // or $tracker = new Morrislaptop\ErrorTracker\Adapter\BugSnag(new Bugsnag_Client('2344324342')); $handler = new Morrislaptop\ErrorTracker\ExceptionHandler($tracker); $handler->bootstrap();
使用
此库的使用是作为报告器,而不是渲染器。因此,建议您在自己的应用程序中处理异常,并在错误类型和环境正确的情况下报告给接口。
您应用程序的一个示例异常处理器可能如下所示:
<?php namespace App; use Exception; use Morrislaptop\ErrorTracker\Tracker; class ExceptionHandler { /** * @var Tracker */ protected $tracker; /** * @param Tracker $tracker */ function __construct(Tracker $tracker) { $this->tracker = $tracker; } /** * Bootstrap this class into the runtime */ public function bootstrap() { error_reporting(-1); set_error_handler([$this, 'handleError']); set_exception_handler([$this, 'handleException']); register_shutdown_function([$this, 'handleShutdown']); } /** * Convert a PHP error to an ErrorException. * * @param int $level * @param string $message * @param string $file * @param int $line * @param array $context * @return void * * @throws \ErrorException */ public function handleError($level, $message, $file = '', $line = 0, $context = array()) { if (error_reporting() & $level) { throw new ErrorException($message, 0, $level, $file, $line); } } /** * Handle an uncaught exception from the application. * * Note: Most exceptions can be handled via the try / catch block in * the HTTP and Console kernels. But, fatal error exceptions must * be handled differently since they are not normal exceptions. * * @param \Exception $e * @return void */ public function handleException($e) { $this->tracker->report($e); throw $e; // throw back to core PHP to render } /** * Handle the PHP shutdown event. * * @return void */ public function handleShutdown() { if ( ! is_null($error = error_get_last()) && in_array($error['type'], [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE])) { $this->handleException(new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line'])); } } }
分组提供者
$monolog = new Monolog\Logger(); $monolog->pushHandler(new StreamHandler('path/to/your.log', Monolog\Logger::ERROR)); $logger = new Morrislaptop\ErrorTracker\Provider\Log($monolog); $sentry = new Morrislaptop\ErrorTracker\Adapter\Sentry(new Raven_Client('https://blah.com')); $bugsnag = new Morrislaptop\ErrorTracker\Adapter\BugSnag(new Bugsnag_Client('2344324342')); // If you wanted to fallback to a log if reporting to Sentry fails.. $chain = new Morrislaptop\ErrorTracker\Group\Chain(); $chain->add($sentry); $chain->add($logger); $chain->report(new \Exception('This will be logged to file if Sentry is down')); // If you wanted to report to Bugsnag AND Sentry to compare those platforms $chain = new Morrislaptop\ErrorTracker\Group\Chain(); $chain->add($sentry); $chain->add($bugsnag); $chain->report(new \Exception('Which is the better platform? This exception will go to both'));
上下文
许多平台支持上下文的概念,以便为您提供有关应用程序中发生的异常的更多信息。这可以在用户、环境或事件级别发生。
将来将通过实现ContextInterface
来实现。在此期间,您可以通过report()
方法传递额外信息,如下所示:
$this->tracker->report($e, ['user_id' => Session::get('user_id')]);
贡献
- 分叉它!
- 创建您的功能分支:
git checkout -b my-new-feature
- 提交您的更改:
git commit -am '添加一些功能'
- 将分支推送到远程:
git push origin my-new-feature
- 提交拉取请求 :D
请参阅CONTRIBUTING文件。
单元测试
为了运行测试套件,请安装开发依赖项
$ composer install --dev
然后,运行以下命令
$ phpunit && phpspec run
PHP-VCR用于记录对SaaS平台的出站请求,并将请求提交到仓库。默认情况下,PHP-VCR设置为不允许任何不匹配现有、已验证请求签名的请求。如果您确信您已做出的更改导致不同的请求,并且该请求应该被记录为正确的请求,您可以
- 更新您的测试中的
setMatchers()
函数以返回true - 删除测试用例,运行测试并提交新的签名
版本控制
遵循语义版本控制。
致谢
灵感来源
许可证
MIT许可证。有关完整的版权和许可证信息,请阅读与源代码一起分发的LICENSE文件。