157 lines
3.8 KiB
PHP
157 lines
3.8 KiB
PHP
<?php
|
|
namespace ProVM\Logview;
|
|
|
|
use DateTimeInterface;
|
|
use DateTimeImmutable;
|
|
|
|
class Log
|
|
{
|
|
protected DateTimeInterface $dateTime;
|
|
protected string $channel;
|
|
protected string $severity;
|
|
protected string $message;
|
|
protected array $stack;
|
|
protected string $context;
|
|
protected string $extra;
|
|
|
|
public function getDate(): DateTimeInterface
|
|
{
|
|
return $this->dateTime;
|
|
}
|
|
public function getChannel(): string
|
|
{
|
|
return $this->channel;
|
|
}
|
|
public function getSeverity(): string
|
|
{
|
|
return $this->severity;
|
|
}
|
|
public function getMessage(): string
|
|
{
|
|
return $this->message;
|
|
}
|
|
public function getStack(): array
|
|
{
|
|
return $this->stack ?? [];
|
|
}
|
|
public function getContext(): string
|
|
{
|
|
return $this->context;
|
|
}
|
|
public function getExtra(): string
|
|
{
|
|
return $this->extra ?? '';
|
|
}
|
|
|
|
public function setDate(DateTimeInterface $dateTime): Log
|
|
{
|
|
$this->dateTime = $dateTime;
|
|
return $this;
|
|
}
|
|
public function setChannel(string $channel): Log
|
|
{
|
|
$this->channel = $channel;
|
|
return $this;
|
|
}
|
|
public function setSeverity(string $severity): Log
|
|
{
|
|
$this->severity = $severity;
|
|
return $this;
|
|
}
|
|
public function setMessage(string $message): Log
|
|
{
|
|
$this->message = $message;
|
|
return $this;
|
|
}
|
|
public function setStack(array $stack): Log
|
|
{
|
|
$this->stack = $stack;
|
|
return $this;
|
|
}
|
|
public function setContext(string $context): Log
|
|
{
|
|
$this->context = $context;
|
|
return $this;
|
|
}
|
|
public function setExtra(string $extra): Log
|
|
{
|
|
$this->extra = $extra;
|
|
return $this;
|
|
}
|
|
|
|
public function hasStack(): bool
|
|
{
|
|
return isset($this->stack);
|
|
}
|
|
public function hasContext(): bool
|
|
{
|
|
return $this->context !== '';
|
|
}
|
|
|
|
public function getColor(): string
|
|
{
|
|
return self::COLORS[strtoupper($this->getSeverity())];
|
|
}
|
|
public function getBackgroundColor(): string
|
|
{
|
|
return self::BACKGROUNDS[strtoupper($this->getSeverity())];
|
|
}
|
|
|
|
public static function parse(string $content): Log
|
|
{
|
|
$log = new Log();
|
|
|
|
$regex = "/\[(?P<date>.*)\]\s(?<channel>\w*)\.(?<severity>\w*):\s(?<message>.*)\s[\[|\{](?<context>.*)[\]|\}]\s\[(?<extra>.*)\]/";
|
|
preg_match($regex, $content, $matches);
|
|
$log->setDate(DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s.uP', $matches['date']));
|
|
$log->setChannel($matches['channel']);
|
|
$log->setSeverity($matches['severity']);
|
|
$message = $matches['message'];
|
|
if (str_contains($message, 'Stack trace')) {
|
|
list($msg, $data) = explode('Stack trace:', $message);
|
|
$message = trim($msg);
|
|
$regex = '/\s#\d+\s/';
|
|
$lines = preg_split($regex, $data);
|
|
array_shift($lines);
|
|
$log->setStack($lines);
|
|
}
|
|
$log->setMessage($message);
|
|
$log->setContext($matches['context']);
|
|
if (isset($matches['extra'])) {
|
|
$log->setExtra($matches['extra']);
|
|
}
|
|
return $log;
|
|
}
|
|
|
|
const LEVELS = [
|
|
'DEBUG',
|
|
'INFO',
|
|
'NOTICE',
|
|
'WARNING',
|
|
'ERROR',
|
|
'CRITICAL',
|
|
'ALERT',
|
|
'EMERGENCY',
|
|
];
|
|
const COLORS = [
|
|
'DEBUG' => '#000',
|
|
'INFO' => '#000',
|
|
'NOTICE' => '#fff',
|
|
'WARNING' => '#000',
|
|
'ERROR' => '#fff',
|
|
'CRITICAL' => '#fff',
|
|
'ALERT' => '#fff',
|
|
'EMERGENCY' => '#fff',
|
|
];
|
|
const BACKGROUNDS = [
|
|
'DEBUG' => '#fff',
|
|
'INFO' => '#00f',
|
|
'NOTICE' => '#55f',
|
|
'WARNING' => '#dd5',
|
|
'ERROR' => '#555',
|
|
'CRITICAL' => '#f00',
|
|
'ALERT' => '#f55',
|
|
'EMERGENCY' => '#f55',
|
|
];
|
|
}
|