wucdbm / http-logger-bundle
一个用于托管HTTP请求/响应以及处理这些请求过程中发生的异常的Symfony 3.0 Bundle
v3.0.14
2017-02-20 15:13 UTC
Requires
- php: ~7.0
- camspiers/json-pretty: ~1.0
- doctrine/doctrine-bundle: ^1.6
- shanethehat/pretty-xml: ~1.0
- symfony/symfony: ~2.8|~3.0
README
此Bundle的目的是在日志中记录HTTP请求/响应。除此之外,您还可以托管异常(\Throwable)。当您使用无法控制的、容易破坏libxml(从而影响Symfony的Crawler)的糟糕API时,这特别有用。
展示
目前,该bundle没有对其收集的数据的展示功能。您应该自己实现这一点。
基本用法
$manager = $this->container->get('some.manager');
$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 Request('GET', 'http://some-website.com/');
$manager->logRequest($log, $request, RequestLogMessageType::ID_TEXT_PLAIN);
$response = $client->send($request);
$manager->logResponse($log, $response, RequestLogMessageType::ID_HTML);
$ex = new \Exception('First Exception');
throw new \Exception('Second Exception', 0, $ex);
} catch (\Throwable $e) {
$manager->logException($log, $e);
}
高级用法
$log = $this->log('SomeClass::someMethod()');
try {
$request = new Request('POST', 'https://someUri.com/API', [
RequestOptions::BODY => 'SomeBody'
]);
$this->logRequest($log, $request, RequestLogMessageType::ID_XML);
$this->pool->sendAsync($request, function (ResponseInterface $response) use ($log) {
try {
$rawResponse = $response->getBody()->getContents();
$this->logResponse($log, $response, RequestLogMessageType::ID_XML);
$crawler = new Crawler($rawResponse);
try {
// do some Crawler work
} catch (\InvalidArgumentException $ex) {
$this->exception($log, $ex, $crawler->html());
}
} catch (\Throwable $ex) {
$this->exception($log, $ex);
}
}, function (RequestException $ex) use ($log) {
$this->requestException($log, $ex, RequestLogMessageType::ID_XML);
});
} catch (\Throwable $ex) {
$this->exception($log, $ex);
}
还有一个名为“logGuzzleException”的方法。它是记录HTTP 500等响应的简写。请注意,这是一个非常基本的示例。此bundle的真正力量在于您必须异步执行大量请求,没有人工概述,通过curl进行,在没有适当日志的情况下,很难找到哪个请求出了问题。
安装 & 设置
config.yml
wucdbm_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
new \Wucdbm\Bundle\WucdbmHttpLoggerBundle\WucdbmHttpLoggerBundle(),
您需要扩展每个实体并创建自己的。您可以自由添加任何额外的字段,并通过您首选的方法映射它们。基本映射是通过bundle中的Subscriber完成的。
<?php
namespace Some\Name\Space;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="SomeRepositoryClass")
*/
class YourRequestLog extends \Wucdbm\Bundle\WucdbmHttpLoggerBundle\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 Wucdbm\Bundle\WucdbmHttpLoggerBundle\Logger\AbstractLogger;
class YourRequestLogLogger extends AbstractLogger {
/**
* @return YourRequestLog
*/
protected function createLog() {
return new YourRequestLog();
}
/**
* @return RequestLogMessage
*/
protected function createLogMessage() {
return new RequestLogMessage();
}
/**
* @return RequestLogException
*/
protected function createLogException() {
return new RequestLogException();
}
/**
* @return RequestLogMessageType
*/
protected 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;
}
}