morrislaptop/error-tracker-adapter

通过最流行的SaaS平台跟踪错误和异常

v0.2.0 2015-02-23 12:20 UTC

This package is auto-updated.

Last update: 2024-08-26 03:40:51 UTC


README

Build Status Total Downloads Latest Stable Version

通过最流行的SaaS平台跟踪错误和异常。

错误跟踪适配器是一个PHP库,它通过提供一个强大的抽象层来帮助您通过错误跟踪SaaS平台和/或本地存储库(如电子邮件和日志文件)跟踪应用程序中的异常和错误。

该库基于以下三个主要原则

架构

SaaS平台

SaaS平台通过适配器支持,目前支持的平台有

本地存储库

通过使用提供者支持本地存储库,如电子邮件、日志或数据库,目前支持的存储库有

如果您使用 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 接口来编写自己的提供者或适配器。您还可以选择使用其他接口 AdapterProviderGroup,并/或扩展抽象类 AbstractAdapterAbstractProviderAbstractGroup,以帮助分类您的跟踪器。

安装

推荐的方式是通过 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')]);

贡献

  1. 分叉它!
  2. 创建您的功能分支:git checkout -b my-new-feature
  3. 提交您的更改:git commit -am '添加一些功能'
  4. 将分支推送到远程:git push origin my-new-feature
  5. 提交拉取请求 :D

请参阅CONTRIBUTING文件。

单元测试

为了运行测试套件,请安装开发依赖项

$ composer install --dev

然后,运行以下命令

$ phpunit && phpspec run

PHP-VCR用于记录对SaaS平台的出站请求,并将请求提交到仓库。默认情况下,PHP-VCR设置为不允许任何不匹配现有、已验证请求签名的请求。如果您确信您已做出的更改导致不同的请求,并且该请求应该被记录为正确的请求,您可以

  • 更新您的测试中的setMatchers()函数以返回true
  • 删除测试用例,运行测试并提交新的签名

版本控制

遵循语义版本控制

致谢

灵感来源

许可证

MIT许可证。有关完整的版权和许可证信息,请阅读与源代码一起分发的LICENSE文件。