dreamcommerce / bugtracker-bundle
DreamCommerce Bugtracker Bundle
1.7.0
2020-09-08 12:57 UTC
Requires
- php: ^7.2
- dreamcommerce/common-bundle: ^1.0
- psr/http-message: ^1.0
- psr/log: ^1.0
- symfony/debug: ^4.4.13
- webmozart/assert: ^1.1.0
Requires (Dev)
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- friendsofphp/php-cs-fixer: ^2.16
- guzzlehttp/guzzle: ^6.2
- matthiasnoback/symfony-dependency-injection-test: ^1.0
- monolog/monolog: ^1.19
- phpunit/phpunit: ^5.5
- polishsymfonycommunity/symfony-mocker-container: ^1.0
- swiftmailer/swiftmailer: ^5.4
- sylius/resource-bundle: ^1.0
- symfony/browser-kit: ^4.4.13
- symfony/symfony: ^4.4.13
- zendframework/zend-json: ^3.0
Suggests
- guzzlehttp/guzzle: Guzzle is a PHP HTTP client library
- monolog/monolog: Allows more advanced logging of the application flow
- symfony/symfony: Great PHP framework !
- zendframework/zend-json: The perfect tool to decode the response from JIRA
README
变更日志
1.7.0
- 将最低的Symfony版本升级到4.4.13
1.6.0
- 将最低的PHP版本升级到7.2
- 将最低的Symfony版本升级到3.4.35或4.4
1.5.0
- 将最低的PHP版本升级到7.1
1.4.0
- 添加了对bugtracker收集器扩展上下文的支持
1.3.4
- 将最低的Symfony版本升级到2.8
- 许多修复
1.3.0
- 添加了更多测试
- 将收集器服务名称更改为dream_commerce_bug_tracker.<名称>_collector
1.2.2
- 修复了Doctrine收集器
- 修复了包配置
1.2.1
- 将ContextInterface移动到dreamcommerce/common-bundle
1.2.0
- 库不再支持PHP 5
- 添加了doctrine DBAL类型
1.1.2
- 添加了上下文特性
1.1.1
- 改进了标记已收集收集器
- 修复了自定义收集器
- 添加了更多示例
1.1.0
- 添加了doctrine收集器
- 添加了swiftmailer收集器
- 改进了jira收集器
安装(独立版)
安装lib/bundle
只需运行,假设您已安装composer.phar或composer二进制文件
$ composer require dreamcommerce/bugtracker-bundle
其他库
如果您想启用除PSR-3处理器以外的其他处理器,您还必须安装其他包
JIRA
$ composer require guzzlehttp/guzzle $ composer require zendframework/zend-json
Doctrine
$ composer require doctrine/orm
Swiftmailer
$ composer require swiftmailer/swiftmailer
安装(在Symfony 4应用程序中)
启用包
在内核中启用包
// app/AppKernel.php public function registerBundles() { $bundles = array( //... new DreamCommerce\Bundle\CommonBundle\DreamCommerceCommonBundle(), new DreamCommerce\Bundle\BugTrackerBundle\DreamCommerceBugTrackerBundle(), //... ); return $bundles; }
最小配置
dream_commerce_bug_tracker: configuration: jira: entry_point: "https://jira.example.com" username: "login" password: "*****" project: "PROJECT_SYMBOL" swiftmailer: sender: "%mailer_user%" recipients: - bugtracker@example.com collectors: psr3: type: psr3 jira: type: jira doctrine: type: doctrine swiftmailer: type: swiftmailer
高级配置
dream_commerce_bug_tracker: configuration: base: token_generator: dream_commerce_bug_tracker.token_generator use_token: false ignore_exceptions: - 'RuntimeException' exceptions: - 'FooException' - 'BarException' jira: entry_point: "https://jira.example.com" username: "login" password: "*****" project: "PROJECT_SYMBOL" labels: [ "app_test" ] assignee: "my.login" token_generator: dream_commerce_bug_tracker.token_generator use_token: true ignore_exceptions: - 'RuntimeException1' exceptions: - 'FooException1' - 'BarException1' doctrine: model: AppBundle\Entity\UserError token_generator: dream_commerce_bug_tracker.token_generator use_token: true swiftmailer: sender: "%mailer_user%" recipients: - bugtracker@example.com ignore_exceptions: - 'RuntimeException2' exceptions: - 'FooException2' - 'BarException2' token_generator: dream_commerce_bug_tracker.token_generator use_token: false collectors: psr3: type: psr3 class: DreamCommerce\Component\BugTracker\Collector\Psr3Collector priority: 100 options: ignore_exceptions: - 'ErrorException' exceptions: - 'MyException' jira: type: jira class: DreamCommerce\Component\BugTracker\Collector\JiraCollector level: error priority: -100 doctrine: type: doctrine class: DreamCommerce\Component\BugTracker\Collector\DoctrineCollector options: model: AppBundle\Entity\UserError swiftmailer: type: swiftmailer class: DreamCommerce\Component\BugTracker\Collector\SwiftMailerCollector custom_1: type: custom class: AppBundle\BugTracker\CustomCollector options: foo: 1 bar: 2
用法
<?php use Psr\Log\LogLevel; // use all collectors try { throw new RuntimeException(); } catch(Exception $exc) { $this->get('bug_tracker')->handle($exc, LogLevel::ERROR, array('a' => 1, 'b' => 2, 'c' => 3, 'd' => new stdClass())); } // use only one collector try { throw new RuntimeException(); } catch(Exception $exc) { $this->get('dream_commerce_bug_tracker.collector.custom_1')->handle($exc); }
示例
Doctrine
<?php namespace AppBundle\Entity; use DreamCommerce\Component\BugTracker\Model\Error; class UserError extends Error { }
<?xml version="1.0" encoding="utf-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <entity repository-class="DreamCommerce\Component\BugTracker\Repository\ORMErrorRepository" name="AppBundle\Entity\UserError" table="user_errors"> <!-- ... --> </entity> </doctrine-mapping>
自定义
<?php namespace AppBundle\BugTracker; use DreamCommerce\Component\BugTracker\Collector\CollectorInterface; use DreamCommerce\Component\Common\Model\ArrayableInterface; use DreamCommerce\Component\Common\Model\ArrayableTrait; use Psr\Log\LogLevel; use Throwable; class CustomCollector implements CollectorInterface, ArrayableInterface { use ArrayableTrait; private $collected = false; private $foo; private $bar; public function __construct(array $options = array()) { $this->fromArray($options); } public function hasSupportException(Throwable $exception, string $level = LogLevel::WARNING, array $context = array()): bool { return is_object($exception) && $exception instanceof \RuntimeException; } public function handle(Throwable $exception, string $level = LogLevel::WARNING, array $context = array()) { echo $exception->getMessage() . '; foo: ' . $this->foo . '; bar: ' . $this->bar; $this->collected = true; } public function isCollected(): bool { return $this->collected; } public function setFoo($foo) { $this->foo = $foo; } public function setBar($bar) { $this->bar = $bar; } }
扩展
Bug Tracker可以在不修改它们的情况下,将额外的上下文注入到来自其他包的异常中。这些上下文在日志中可见,可以帮助诊断错误。这可以通过实现具有特殊标记的适当接口的简单服务来实现。有关更多信息,请参考以下示例。
首先,您需要创建一个实现 ContextCollectorExtensionInterface 接口的服务。实现ContextCollectorExtensionInterface的类需要一个名为 getAdditionalContext 的方法。有关详细信息,请参阅接口文件。
<?php namespace AppBundle\BugTracker\Extension; use DreamCommerce\Component\BugTracker\Collector\Extension\ContextCollectorExtensionInterface; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpFoundation\RequestStack; class ContextCollectorExtension implements ContextCollectorExtensionInterface { /** * @var RequestStack */ private $requestStack; public function __construct(RequestStack $requestStack) { $this->requestStack = $requestStack; } public function getAdditionalContext(\Throwable $throwable): array { if ($throwable instanceof HttpException) { $request = $this->requestStack->getMasterRequest(); if ($request === null) { return []; } return [ 'query' => serialize($request->query->all()), 'client_ip' => $request->server->get('REMOTE_ADDR') ]; } return []; } }
下一步是创建我们的服务定义,带有标签 dream_commerce_bug_tracker.collector_extension
... <service id="app.bug_tracker_extension" class="AppBundle\BugTracker\Extension\ContextCollectorExtension"> <argument type="service" id="request_stack" /> <tag name="dream_commerce_bug_tracker.collector_extension" /> </service> ...
现在,每当抛出HttpException时,我们将在日志文件中看到我们的附加信息。
如果您愿意,可以使用我们的嵌入式扩展
- ClientIpContextExtension - 将客户端IP添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\ClientIpContextExtension"> <argument type="service" id="request_stack" /> <tag name="dream_commerce_bug_tracker.collector_extension" /> </service>
- QueryDataContextExtension - 将存储在$_GET变量中的参数添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\QueryDataContextExtension"> <argument type="service" id="request_stack" /> <tag name="dream_commerce_bug_tracker.collector_extension" /> </service>
- RequestDataContextExtension - 将存储在$_POST变量中的参数添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\RequestDataContextExtension"> <argument type="service" id="request_stack" /> <tag name="dream_commerce_bug_tracker.collector_extension" /> </service>
- UserInfoContextExtension - 将有关当前用户(登录、角色、凭据等)的信息添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\UserInfoContextExtension"> <argument type="service" id="security.token_storage" /> <tag name="dream_commerce_bug_tracker.collector_extension" /> </service>
作者
- Michał Korus michal.korus@dreamcommerce.com
- Daniel Hornik daniel.1302@gmail.com