This commit is contained in:
Marcel Pociot
2020-04-24 12:37:31 +02:00
parent 018d778e5f
commit 9ce19f975e
28 changed files with 1160 additions and 91 deletions

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Logger;
use Illuminate\Console\OutputStyle;
use Illuminate\Support\Collection;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
class CliRequestLogger extends Logger
{
/** @var Table */
protected $table;
/** @var Collection */
protected $requests;
/** @var \Symfony\Component\Console\Output\ConsoleSectionOutput */
protected $section;
public function __construct(ConsoleOutputInterface $consoleOutput)
{
parent::__construct($consoleOutput);
$this->section = $this->output->section();
$this->table = new Table($this->section);
$this->table->setHeaders(['Method', 'URI', 'Response', 'Duration']);
$this->requests = new Collection();
}
public function logRequest(LoggedRequest $loggedRequest)
{
if ($this->requests->has($loggedRequest->id())) {
$this->requests[$loggedRequest->id()] = $loggedRequest;
} else {
$this->requests->prepend($loggedRequest, $loggedRequest->id());
}
$this->requests = $this->requests->slice(0, 10);
$this->section->clear();
$this->table->setRows($this->requests->map(function (LoggedRequest $loggedRequest) {
return [
$loggedRequest->getRequest()->getMethod(),
$loggedRequest->getRequest()->getUri(),
optional($loggedRequest->getResponse())->getStatusCode() . ' ' . optional($loggedRequest->getResponse())->getReasonPhrase(),
$loggedRequest->getDuration().'ms'
];
})->toArray());
$this->table->render();
}
}

View File

@@ -56,7 +56,7 @@ class LoggedRequest implements \JsonSerializable
$data = [
'id' => $this->id,
'performed_at' => $this->startTime->toDateTimeString(),
'duration' => $this->startTime->diffInMilliseconds($this->stopTime, false),
'duration' => $this->getDuration(),
'subdomain' => $this->detectSubdomain(),
'request' => [
'raw' => $this->isBinary($this->rawRequest) ? 'BINARY' : $this->rawRequest,
@@ -132,6 +132,11 @@ class LoggedRequest implements \JsonSerializable
return $this->rawRequest;
}
public function getResponse()
{
return $this->parsedResponse;
}
protected function getResponseBody()
{
return \Laminas\Http\Response::fromString($this->rawResponse)->getBody();
@@ -198,4 +203,9 @@ class LoggedRequest implements \JsonSerializable
{
return Arr::get($this->parsedRequest->getHeaders()->toArray(), 'X-Expose-Request-ID', (string)Str::uuid());
}
public function getDuration()
{
return $this->startTime->diffInMilliseconds($this->stopTime, false);
}
}

View File

@@ -2,64 +2,21 @@
namespace App\Logger;
use Illuminate\Console\Concerns\InteractsWithIO;
use Illuminate\Console\OutputStyle;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Logger
{
/** @var \Symfony\Component\Console\Output\OutputInterface */
protected $consoleOutput;
use InteractsWithIO;
/** @var bool */
protected $enabled = false;
/** @var ConsoleOutputInterface */
protected $output;
/** @var bool */
protected $verbose = false;
public function __construct(OutputInterface $consoleOutput)
public function __construct(ConsoleOutputInterface $consoleOutput)
{
$this->consoleOutput = $consoleOutput;
}
public function enable($enabled = true)
{
$this->enabled = $enabled;
return $this;
}
public function verbose($verbose = false)
{
$this->verbose = $verbose;
return $this;
}
protected function info(string $message)
{
$this->line($message, 'info');
}
protected function warn(string $message)
{
if (! $this->consoleOutput->getFormatter()->hasStyle('warning')) {
$style = new OutputFormatterStyle('yellow');
$this->consoleOutput->getFormatter()->setStyle('warning', $style);
}
$this->line($message, 'warning');
}
protected function error(string $message)
{
$this->line($message, 'error');
}
protected function line(string $message, string $style)
{
$styled = $style ? "<$style>$message</$style>" : $message;
$this->consoleOutput->writeln($styled);
$this->output = $consoleOutput;
}
}

View File

@@ -10,12 +10,19 @@ use function GuzzleHttp\Psr7\stream_for;
class RequestLogger
{
/** @var array */
protected $requests = [];
/** @var array */
protected $responses = [];
public function __construct(Browser $browser)
/** @var CliRequestLogger */
protected $cliRequestLogger;
public function __construct(Browser $browser, CliRequestLogger $cliRequestLogger)
{
$this->client = $browser;
$this->cliRequestLogger = $cliRequestLogger;
}
public function findLoggedRequest(string $id): ?LoggedRequest
@@ -27,10 +34,14 @@ class RequestLogger
public function logRequest(string $rawRequest, Request $request)
{
array_unshift($this->requests, new LoggedRequest($rawRequest, $request));
$loggedRequest = new LoggedRequest($rawRequest, $request);
array_unshift($this->requests, $loggedRequest);
$this->requests = array_slice($this->requests, 0, 10);
$this->cliRequestLogger->logRequest($loggedRequest);
$this->pushLogs();
}
@@ -42,6 +53,8 @@ class RequestLogger
if ($loggedRequest) {
$loggedRequest->setResponse($rawResponse, Response::fromString($rawResponse));
$this->cliRequestLogger->logRequest($loggedRequest);
$this->pushLogs();
}
}