forci/ http-logger-bundle
这是一个用于托管HTTP请求/响应以及处理这些请求时发生的异常的Symfony 3.0 Bundle
v0.5.0
2020-01-17 10:22 UTC
Requires
- php: >=7.1.3
- ext-iconv: *
- camspiers/json-pretty: ~1.0
- doctrine/doctrine-bundle: ~1.12
- doctrine/orm: ~2.7
- shanethehat/pretty-xml: ~1.0
- symfony/framework-bundle: ~4.3|~5.0
- twig/twig: ~2.0|~3.0
Requires (Dev)
- doctrine/orm: ~2.6
- friendsofphp/php-cs-fixer: ^2.8
- guzzlehttp/guzzle: ~6.0
- wucdbm/php-cs-fixers: ~0.2
README
此Bundle的目的是在日志中记录HTTP请求/响应。除此之外,您还可以托管异常(\Throwable)。当您与无法控制的、容易破坏libxml(从而影响Symfony的Crawler)的糟糕API一起工作时,这特别有用。
演示
目前,该bundle没有收集到的数据的演示。您应该自行实现。
基本用法
<?php /** @var \Forci\Bundle\HttpLogger\Logger\AbstractLogger $manager */ $manager = $this->container->get('some.logger'); /** @var \Forci\Bundle\HttpLogger\Entity\RequestLog $log */ $log = $manager->log('This is some message with any information that would eventually help you once you need to debug something'); try { $client = new \GuzzleHttp\Client(); $request = new \GuzzleHttp\Psr7\Request('GET', 'http://some-website.com/'); $manager->logRequest($log, $request, \Forci\Bundle\HttpLogger\Entity\RequestLogMessageType::ID_TEXT_PLAIN); $response = $client->send($request); $manager->logResponse($log, $response, \Forci\Bundle\HttpLogger\Entity\RequestLogMessageType::ID_HTML); $ex = new \Exception('First Exception'); throw new \Exception('Second Exception', 0, $ex); } catch (\Throwable $e) { $manager->logException($log, $e); }
高级用法
<?php $log = $this->log('SomeClass::someMethod()'); try { $request = new \GuzzleHttp\Psr7\Request('POST', 'https://someUri.com/API', [ \GuzzleHttp\RequestOptions::BODY => 'SomeBody' ]); $this->logRequest($log, $request, \Forci\Bundle\HttpLogger\Entity\RequestLogMessageType::ID_XML); $this->pool->sendAsync($request, function (\Psr\Http\Message\ResponseInterface $response) use ($log) { try { $rawResponse = $response->getBody()->getContents(); $this->logResponse($log, $response, \Forci\Bundle\HttpLogger\Entity\RequestLogMessageType::ID_XML); /** @var \Symfony\Component\DomCrawler\Crawler $crawler */ $crawler = new \Symfony\Component\DomCrawler\Crawler($rawResponse); try { $crawler->filterXPath('//some/path'); // do some Crawler work } catch (\InvalidArgumentException $ex) { $this->exception($log, $ex, $crawler->html()); } } catch (\Throwable $ex) { $this->exception($log, $ex); } }, function (\GuzzleHttp\Exception\RequestException $ex) use ($log) { $this->requestException($log, $ex, \Forci\Bundle\HttpLogger\Entity\RequestLogMessageType::ID_XML); }); } catch (\Throwable $ex) { $this->exception($log, $ex); }
还有一个名为“logGuzzleException”的方法。它是记录HTTP 500等错误时的响应的简写。请注意,这是一个非常基础的例子。此bundle的真正威力在于您需要异步执行大量请求,没有人工监督,通过curl进行,而如果没有适当的日志,很难找到哪个请求出了问题。
安装与设置
config.yml
forci_http_logger: configs: bookings: table_prefix: some_logs__ log_class: Some\Name\Space\RequestLog log_message_class: Some\Name\Space\RequestLogMessage log_message_type_class: Some\Name\Space\RequestLogMessageType log_exception_class: Some\Name\Space\RequestLogException
AppKernel
<?php // Add this to your AppKernel.php $bundles = [ // ... new \Forci\Bundle\HttpLogger\ForciHttpLoggerBundle(), // ... ];
您需要扩展每个实体并创建自己的。您可以自由添加任何额外字段,并通过您首选的方法映射它们。基本的映射是通过bundle中的Subscriber完成的。
<?php namespace Some\Name\Space; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="SomeRepositoryClass") */ class YourRequestLog extends \Forci\Bundle\HttpLogger\Entity\RequestLog { /** * @ORM\ManyToOne(targetEntity="Some\Name\Space\SomeOtherEntity", inversedBy="inverseSideField") * @ORM\JoinColumn(name="relation_id", referencedColumnName="id", nullable=alse) */ protected $someOtherEntity; }
最后,在您可以使用logger之前,您必须创建一个扩展\Wucdbm\Bundle\WucdbmHttpLoggerBundle\Logger\AbstractLogger
的Logger。您必须实现创建每个实体的工厂方法。这可能在未来的版本中自动化,因此我建议不要在这些上创建构造函数,除非我有足够的时间并使用接口和基工厂实现一个即插即用的解决方案。
<?php namespace App\Logger; // any other use, dopped for brevity use Forci\Bundle\HttpLogger\Logger\AbstractLogger; class YourRequestLogLogger extends AbstractLogger { /** * @return YourRequestLog */ public function createLog() { return new YourRequestLog(); } /** * @return RequestLogMessage */ public function createLogMessage() { return new RequestLogMessage(); } /** * @return RequestLogException */ public function createLogException() { return new RequestLogException(); } /** * @return RequestLogMessageType */ public function createLogMessageType() { return new RequestLogMessageType(); } /** * @return YourRequestLog */ public function log(string $msg, SomeOtherEntity $entity) { /** @var RequestLog $log */ $log = parent::_log($msg); $log->setSomeOtherEntity($entity); $this->save($log); return $log; } }