Reverse order and multiple log files handler

This commit is contained in:
2023-02-15 17:45:23 -03:00
parent 110f37e4f4
commit c29eece81c
16 changed files with 494 additions and 101 deletions

View File

@ -22,4 +22,21 @@ class Logs
}
return $view->render($response, 'logs.show', compact('log', 'levels'));
}
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);
$logs = [];
foreach ($log->getLogs($start, $amount) as $l) {
$logs []= $l;
}
$logs = array_reverse($logs);
$total = $log->getTotal();
$response->getBody()->write(\Safe\json_encode([
'total' => $total,
'logs' => $logs
]));
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json');
}
}

View File

@ -0,0 +1,7 @@
<?php
namespace ProVM\Common\Define;
interface Log
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace ProVM\Common\Define;
interface Parser
{
public function parse(string $content): Log;
}

View File

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

View File

@ -5,6 +5,8 @@ use DateTimeImmutable;
use SplFileInfo;
use Psr\Log\LoggerInterface;
use ProVM\Logview\Log\File;
use ProVM\Common\Define\Parser;
use ProVM\Logview\Parser as Parsers;
class Logs
{
@ -50,15 +52,31 @@ class Logs
}
return $output;
}
public function getParser(string $filename): Parser
{
$map = [
Parsers\Access::class => '/(access.log)/',
Parsers\Error::class => '/(error.log)/',
Parsers\Monolog::class => '/(php-\d{4}-\d{2}-\d{2}.log)/',
Parsers\PHPDefault::class => '/(php_errors.log)/'
];
foreach ($map as $class => $regex) {
if (\Safe\preg_match($regex, $filename) === 1) {
return new $class;
}
}
return new Parsers\Basic();
}
public function get(string $log_file): File
{
$filename = implode(DIRECTORY_SEPARATOR, [$this->getFolder(), $log_file]);
$file_info = new SplFileInfo($filename);
$content = \Safe\file_get_contents($filename);
$parser = $this->getParser($log_file);
return (new File())
->setLogger($this->getLogger())
->setParser($parser)
->setFullname($filename)
->setFilename($log_file)
->setDate((new DateTimeImmutable())->setTimestamp($file_info->getCTime()))
->setContent($content);
->setDate((new DateTimeImmutable())->setTimestamp($file_info->getCTime()));
}
}