wucdbm/http-logger-bundle

一个用于托管HTTP请求/响应以及处理这些请求过程中发生的异常的Symfony 3.0 Bundle

安装: 901

依赖者: 0

建议者: 0

安全性: 0

星级: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

v3.0.14 2017-02-20 15:13 UTC

This package is auto-updated.

Last update: 2024-09-16 08:44:02 UTC


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;
    }

}