Colors moved to template files, and namespace cleanups

This commit is contained in:
2023-05-18 16:59:14 -04:00
parent 0580cb5d30
commit 60a7ebb231
7 changed files with 99 additions and 73 deletions

View File

@ -5,7 +5,7 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Slim\Views\Blade as View; use Slim\Views\Blade as View;
use ProVM\Common\Service\Logs as Service; use ProVM\Common\Service\Logs as Service;
use ProVM\Logview\Log; use function Safe\json_encode;
class Logs class Logs
{ {
@ -13,16 +13,9 @@ class Logs
{ {
$log = $service->get($log_file); $log = $service->get($log_file);
$levels = []; return $view->render($response, 'logs.show', compact('log'));
foreach (Log::LEVELS as $level) {
$levels[strtolower($level)] = (object) [
'text' => Log::COLORS[$level],
'background' => Log::BACKGROUNDS[$level],
];
} }
return $view->render($response, 'logs.show', compact('log', 'levels')); public function getMore(ServerRequestInterface $request, ResponseInterface $response, Service $service, string $log_file, int $start = 0, int $amount = 100): ResponseInterface
}
public function getMore(ServerRequestInterface $request, ResponseInterface $response, View $view, Service $service, string $log_file, int $start = 0, int $amount = 100): ResponseInterface
{ {
$log = $service->get($log_file); $log = $service->get($log_file);
@ -32,7 +25,7 @@ class Logs
} }
$logs = array_reverse($logs); $logs = array_reverse($logs);
$total = $log->getTotal(); $total = $log->getTotal();
$response->getBody()->write(\Safe\json_encode([ $response->getBody()->write(json_encode([
'total' => $total, 'total' => $total,
'logs' => $logs 'logs' => $logs
])); ]));

View File

@ -1,14 +1,18 @@
<?php <?php
namespace ProVM\Common\Implement; namespace ProVM\Common\Implement;
use Exception;
use ProVM\Common\Define\Log; use ProVM\Common\Define\Log;
use ProVM\Logview\Log as LogContent;
use ProVM\Common\Define\Parser as Definition;
use function Safe\fopen;
abstract class Parser implements \ProVM\Common\Define\Parser abstract class Parser implements Definition
{ {
public function total(string $filename): int public function total(string $filename): int
{ {
try { try {
$fh = \Safe\fopen($filename, 'r'); $fh = fopen($filename, 'r');
$cnt = 0; $cnt = 0;
while(!feof($fh)) { while(!feof($fh)) {
$line = fgets($fh); $line = fgets($fh);
@ -16,12 +20,12 @@ abstract class Parser implements \ProVM\Common\Define\Parser
} }
fclose($fh); fclose($fh);
return $cnt; return $cnt;
} catch (\Exception $e) { } catch (Exception $e) {
return 0; return 0;
} }
} }
public function parse(string $content): Log public function parse(string $content): Log
{ {
return new \ProVM\Logview\Log($content); return new LogContent($content);
} }
} }

View File

@ -3,11 +3,14 @@ namespace ProVM\Common\Service;
use DateTimeImmutable; use DateTimeImmutable;
use SplFileInfo; use SplFileInfo;
use FilesystemIterator;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use ProVM\Logview\Log\File; use ProVM\Logview\Log\File;
use ProVM\Common\Define\Parser; use ProVM\Common\Define\Parser;
use ProVM\Logview\Parser as Parsers; use ProVM\Logview\Parser as Parsers;
use function Safe\{preg_match};
class Logs class Logs
{ {
public function __construct(LoggerInterface $logger, string $folder) public function __construct(LoggerInterface $logger, string $folder)
@ -42,7 +45,7 @@ class Logs
public function getFiles(): array public function getFiles(): array
{ {
$files = new \FilesystemIterator($this->getFolder()); $files = new FilesystemIterator($this->getFolder());
$output = []; $output = [];
foreach ($files as $file) { foreach ($files as $file) {
if ($file->isDir()) { if ($file->isDir()) {
@ -61,7 +64,7 @@ class Logs
Parsers\PHPDefault::class => '/(php_errors.log)/' Parsers\PHPDefault::class => '/(php_errors.log)/'
]; ];
foreach ($map as $class => $regex) { foreach ($map as $class => $regex) {
if (\Safe\preg_match($regex, $filename) === 1) { if (preg_match($regex, $filename) === 1) {
return new $class; return new $class;
} }
} }

View File

@ -12,14 +12,52 @@
@push('page_styles') @push('page_styles')
<style> <style>
body {overflow-y:scroll;} body {overflow-y:scroll;}
@foreach ($levels as $level => $colors) {{--@foreach ($levels as $level => $colors)
.{{$level}} {background-color: {{$colors->background}}; color: {{$colors->text}};} .{{$level}} {background-color: {{$colors->background}}; color: {{$colors->text}};}
@endforeach @endforeach--}}
</style> </style>
@endpush @endpush
@push('page_scripts') @push('page_scripts')
<script type="text/javascript"> <script type="text/javascript">
const colors = {
debug: {
color: '#000',
background: '#fff'
},
info: {
color: '#fff',
background: '#2727e8'
},
notice: {
color: '#fff',
background: '#55f'
},
warning: {
color: '#000',
background: '#f5f580'
},
error: {
color: '#fff',
background: '#464646'
},
critical: {
color: '#fff',
background: '#cb0000'
},
alert: {
color: '#fff',
background: '#ec6060'
},
emergency: {
color: '#fff',
background: '#b95757'
},
deprecated: {
color: '#fff',
background: '#ce4000'
}
}
const icons = { const icons = {
debug: 'bug', debug: 'bug',
info: 'search', info: 'search',
@ -159,7 +197,18 @@
ob.observe(watch) ob.observe(watch)
} }
} }
function buildColors() {
const styleDOM = document.createElement('style')
const styles = []
Object.keys(colors).forEach(level => {
styles.push('.' + level + ' {color: ' + colors[level].color + '; background-color: ' + colors[level].background + '}')
})
styleDOM.innerHTML = styles.join("\n")
document.getElementsByTagName('head')[0].appendChild(styleDOM)
}
$(document).ready(() => { $(document).ready(() => {
buildColors()
logs.setup('logs') logs.setup('logs')
}) })
</script> </script>

View File

@ -3,8 +3,10 @@ namespace ProVM\Logview;
use DateTimeInterface; use DateTimeInterface;
use DateTimeImmutable; use DateTimeImmutable;
use JsonSerializable;
use ProVM\Common\Define\Log as Definition;
class Log implements \ProVM\Common\Define\Log, \JsonSerializable class Log implements Definition, JsonSerializable
{ {
public function __construct(?string $original = null) public function __construct(?string $original = null)
{ {
@ -110,15 +112,6 @@ class Log implements \ProVM\Common\Define\Log, \JsonSerializable
return isset($this->context) and $this->context !== ''; return isset($this->context) and $this->context !== '';
} }
public function getColor(): string
{
return self::COLORS[strtoupper($this->getSeverity())];
}
public function getBackgroundColor(): string
{
return self::BACKGROUNDS[strtoupper($this->getSeverity())];
}
public function jsonSerialize(): mixed public function jsonSerialize(): mixed
{ {
return ($this->parsed()) ? [ return ($this->parsed()) ? [
@ -147,26 +140,4 @@ class Log implements \ProVM\Common\Define\Log, \JsonSerializable
'EMERGENCY', 'EMERGENCY',
'DEPRECATED', 'DEPRECATED',
]; ];
const COLORS = [
'DEBUG' => '#000',
'INFO' => '#fff',
'NOTICE' => '#fff',
'WARNING' => '#000',
'ERROR' => '#fff',
'CRITICAL' => '#fff',
'ALERT' => '#fff',
'EMERGENCY' => '#fff',
'DEPRECATED' => '#fff',
];
const BACKGROUNDS = [
'DEBUG' => '#fff',
'INFO' => '#00f',
'NOTICE' => '#55f',
'WARNING' => '#dd5',
'ERROR' => '#555',
'CRITICAL' => '#f00',
'ALERT' => '#f55',
'EMERGENCY' => '#f55',
'DEPRECATED' => '#f50',
];
} }

View File

@ -1,7 +1,10 @@
<?php <?php
namespace ProVM\Logview\Parser; namespace ProVM\Logview\Parser;
use Exception;
use Error;
use Safe\DateTimeImmutable; use Safe\DateTimeImmutable;
use function Safe\{fopen, error_log, json_encode, preg_match, preg_match_all};
use ProVM\Common\Define\Log; use ProVM\Common\Define\Log;
use ProVM\Common\Implement\Parser; use ProVM\Common\Implement\Parser;
@ -11,16 +14,16 @@ class Monolog extends Parser
{ {
try { try {
$regex = "/\[(?P<date>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}(?:\+|-)\d{2}:\d{2})\]/"; $regex = "/\[(?P<date>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}(?:\+|-)\d{2}:\d{2})\]/";
$fh = \Safe\fopen($filename, 'r'); $fh = fopen($filename, 'r');
$sum = 0; $sum = 0;
while(!feof($fh)) { while(!feof($fh)) {
$line = fgets($fh); $line = fgets($fh);
$sum += \Safe\preg_match_all($regex, $line); $sum += preg_match_all($regex, $line);
} }
fclose($fh); fclose($fh);
return $sum; return $sum;
} catch (\Exception $e) { } catch (Exception $e) {
\Safe\error_log($e . PHP_EOL, 3, '/logs/total.log'); error_log($e . PHP_EOL, 3, '/logs/total.log');
return 0; return 0;
} }
} }
@ -38,10 +41,10 @@ class Monolog extends Parser
]; ];
$regex = implode('', $regex); $regex = implode('', $regex);
try { try {
\Safe\preg_match("/{$regex}/", $content, $matches); preg_match("/{$regex}/", $content, $matches);
} catch (\Exception $e) { } catch (Exception $e) {
\Safe\error_log($content . PHP_EOL, 3, '/logs/debug.log'); error_log($content . PHP_EOL, 3, '/logs/debug.log');
\Safe\error_log($e . PHP_EOL, 3, '/logs/debug.log'); error_log($e . PHP_EOL, 3, '/logs/debug.log');
return $log; return $log;
} }
@ -49,7 +52,7 @@ class Monolog extends Parser
$extra = []; $extra = [];
try { try {
$log->setDate(DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s.uP', $matches['date'])); $log->setDate(DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s.uP', $matches['date']));
} catch (\Exception $e) { } catch (Exception $e) {
$log->setDate(new DateTimeImmutable()); $log->setDate(new DateTimeImmutable());
$extra['date'] = $matches['date']; $extra['date'] = $matches['date'];
} }
@ -72,11 +75,11 @@ class Monolog extends Parser
$extra['extra'] = "{{$matches['extra']}}"; $extra['extra'] = "{{$matches['extra']}}";
} }
if (count($extra) > 0) { if (count($extra) > 0) {
$log->setExtra(\Safe\json_encode($extra, JSON_UNESCAPED_SLASHES)); $log->setExtra(json_encode($extra, JSON_UNESCAPED_SLASHES));
} }
} catch (\Error $e) { } catch (Error $e) {
\Safe\error_log($e . PHP_EOL, 3, '/logs/debug.log'); error_log($e . PHP_EOL, 3, '/logs/debug.log');
\Safe\error_log(var_export($matches, true) . PHP_EOL, 3, '/logs/debug.log'); error_log(var_export($matches, true) . PHP_EOL, 3, '/logs/debug.log');
} }
return $log; return $log;

View File

@ -1,7 +1,10 @@
<?php <?php
namespace ProVM\Logview\Parser; namespace ProVM\Logview\Parser;
use Error;
use Exception;
use Safe\DateTimeImmutable; use Safe\DateTimeImmutable;
use function Safe\{fopen, preg_match_all, preg_match, error_log, json_encode};
use ProVM\Common\Define\Log; use ProVM\Common\Define\Log;
use ProVM\Common\Implement\Parser; use ProVM\Common\Implement\Parser;
@ -11,15 +14,15 @@ class PHPDefault extends Parser
{ {
try { try {
$regex = "/\[(?<date>\d{2}-\w{3}-\d{4}\s\d{2}:\d{2}:\d{2}\s\w{3})\]/"; $regex = "/\[(?<date>\d{2}-\w{3}-\d{4}\s\d{2}:\d{2}:\d{2}\s\w{3})\]/";
$fh = \Safe\fopen($filename, 'r'); $fh = fopen($filename, 'r');
$sum = 0; $sum = 0;
while(!feof($fh)) { while(!feof($fh)) {
$line = fgets($fh); $line = fgets($fh);
$sum += \Safe\preg_match_all($regex, $line); $sum += preg_match_all($regex, $line);
} }
fclose($fh); fclose($fh);
return $sum; return $sum;
} catch (\Exception $e) { } catch (Exception $e) {
return 0; return 0;
} }
} }
@ -28,25 +31,25 @@ class PHPDefault extends Parser
$log = parent::parse($content); $log = parent::parse($content);
$regex = "/\[(?<date>\d{2}-\w{3}-\d{4}\s\d{2}:\d{2}:\d{2}\s\w{3})\]\s(?<level>PHP|User)\s(?<severity>\w+):\s(?<message>.*)/"; $regex = "/\[(?<date>\d{2}-\w{3}-\d{4}\s\d{2}:\d{2}:\d{2}\s\w{3})\]\s(?<level>PHP|User)\s(?<severity>\w+):\s(?<message>.*)/";
try { try {
\Safe\preg_match($regex, $content, $matches); preg_match($regex, $content, $matches);
} catch (\Error $e) { } catch (Error $e) {
\Safe\error_log($e . PHP_EOL, 3, '/logs/debug.log'); error_log($e . PHP_EOL, 3, '/logs/debug.log');
return $log; return $log;
} }
$extra = []; $extra = [];
try { try {
$log->setDate(DateTimeImmutable::createFromFormat('d-M-Y H:i:s e', $matches['date'])); $log->setDate(DateTimeImmutable::createFromFormat('d-M-Y H:i:s e', $matches['date']));
} catch (\Exception $e) { } catch (Exception $e) {
$log->setDate(new DateTimeImmutable()); $log->setDate(new DateTimeImmutable());
$extra['date'] = $matches['date']; $extra['date'] = $matches['date'];
} }
$log->setChannel(''); $log->setChannel('');
$log->setSeverity($matches['severity']); $log->setSeverity($matches['severity']);
$log->setMessage($matches['message']); $log->setMessage($matches['message']);
$log->setContext(\Safe\json_encode(['level' => $matches['level']], JSON_UNESCAPED_SLASHES)); $log->setContext(json_encode(['level' => $matches['level']], JSON_UNESCAPED_SLASHES));
if (count($extra) > 0) { if (count($extra) > 0) {
$log->setExtra(\Safe\json_encode($extra, JSON_UNESCAPED_SLASHES)); $log->setExtra(json_encode($extra, JSON_UNESCAPED_SLASHES));
} }
return $log; return $log;