Update for logs

Viewing an individual log.
Memory eats like not into itself  :(
Log 7644 lines, 4.46 MB:
[ Generated in 0.366 seconds, 3 queries executed - Memory usage: 46.84 MiB (Peak: 66.83 MiB) ]
This commit is contained in:
Visman 2021-02-23 17:06:21 +07:00
parent 7196007c21
commit 1a8ab3938f
6 changed files with 172 additions and 4 deletions

View file

@ -209,4 +209,68 @@ class LogViewer
return $result;
}
public function parse(string $file): array
{
$result = [];
$handle = \fopen($file, 'rb');
if ($handle) {
$contents = '';
$current = '';
$matches1 = [];
while (! \feof($handle)) {
$contents .= \fread($handle, 8192);
$contents = \str_replace("\r\n", "\n", $contents);
$contents = \str_replace("\r", "\n", $contents);
while (false !== ($pos = \strpos($contents, "\n"))) {
$line = \substr($contents, 0, $pos + 1);
$contents = \substr($contents, $pos + 1);
if (\preg_match($this->typePattern, $line, $matches)) {
if ('' !== $current) {
$result[] = $this->toResult($current, $matches1);
}
$current = $line;
$matches1 = $matches;
} else {
$current .= $line;
}
}
}
\fclose($handle);
}
if ('' !== $current) {
$result[] = $this->toResult($current, $matches1);
}
return $result;
}
protected function toResult(string $current, array $matches1): array
{
if (\preg_match($this->linePattern, $current, $matches2)) {
$result = $this->clearMatches($matches2);
$result['context'] = \json_decode($result['context'], true, 512, \JSON_THROW_ON_ERROR);
return $result;
} else {
return $this->clearMatches($matches1) + [
'message' => 'LOG PARSER ERROR',
'context' => null,
];
}
}
protected function clearMatches(array $matches): array
{
return \array_filter($matches, function($key) {
return \is_string($key);
}, \ARRAY_FILTER_USE_KEY);
}
}

View file

@ -68,7 +68,7 @@ class Logs extends Admin
$path = $this->c->LogViewer->getPath($args['hash']);
if (
null === $path
! \is_string($path)
|| ! \is_file($path)
) {
return $this->c->Message->message('Not Found', true, 404);
@ -76,7 +76,7 @@ class Logs extends Admin
$this->c->Lang->load('admin_logs');
$this->aIndex = 'logs';
$this->aIndex = 'logs';
switch ($args['action']) {
case 'view':
@ -163,4 +163,24 @@ class Logs extends Admin
return $form;
}
protected function view(string $path, array $args, string $method): Page
{
$data = $this->c->LogViewer->parse($path);
foreach ($data as &$cur) {
$cur['context'] = \print_r($cur['context'], true);
}
unset($cur);
$this->nameTpl = 'admin/logs';
$this->logData = $data;
$this->logName = $this->c->LogViewer->getName($path);
$this->aCrumbs[] = [
$this->c->Router->link('AdminLogsAction', $args),
__('Log %s', $this->logName),
];
return $this;
}
}

View file

@ -59,3 +59,6 @@ msgstr "Log deleted."
msgid "Failed to delete log redirect"
msgstr "Failed to delete log."
msgid "Log %s"
msgstr "Log %s"

View file

@ -59,3 +59,6 @@ msgstr "Лог удален."
msgid "Failed to delete log redirect"
msgstr "Лог не удалось удалить."
msgid "Log %s"
msgstr "Лог %s"

View file

@ -41,3 +41,32 @@
</div>
</section>
@endisset
@isset ($p->logData)
<section id="fork-logview" class="f-admin">
<h2>{!! __('Log %s', $p->logName) !!}</h2>
<div>
<fieldset>
<ul>
@foreach ($p->logData as $cur)
<li class="f-lgli">
@if ($cur['context'])
<details class="f-lgdtl">
<summary class="f-lgsu">
@endif
<span class="f-lgdt"><span class="f-lgdts">{{ $cur['datetime'] }}</span></span>
<span class="f-lglv @if ('emergency' === $cur['level_name']) f-llvem @elseif ('alert' === $cur['level_name']) f-llval @elseif ('critical' === $cur['level_name']) f-llvcr @elseif ('error' === $cur['level_name']) f-llver @elseif ('warning' === $cur['level_name']) f-llvwa @elseif ('notice' === $cur['level_name']) f-llvno @elseif ('info' === $cur['level_name']) f-llvin @elseif ('debug' === $cur['level_name']) f-llvde @endif"><span class="f-lglvs">{{ $cur['level_name'] }}</span></span>
<span class="f-lgmes"><span class="f-lgmess">{{ $cur['message'] }}</span></span>
@if ($cur['context'])
</summary>
<pre class="f-lgpre">
{{ $cur['context'] }}
</pre>
</details>
@endif
</li>
@endforeach
</ul>
</fieldset>
</div>
</section>
@endisset

View file

@ -2374,8 +2374,8 @@ html[lang="ru"] #fork details[open] > summary::after {
flex-direction: column;
}
#forka .f-editforums-form .f-fbtn[data-name=new],
#forka .f-editforum-form .f-fbtn[name=reset] {
#forka .f-editforums-form .f-fbtn[data-name="new"],
#forka .f-editforum-form .f-fbtn[name="reset"] {
width: auto;
margin-bottom: 0.625rem;
margin-left: auto;
@ -3392,6 +3392,55 @@ html[lang="ru"] #fork details[open] > summary::after {
width: auto;
}
#fork-logview .f-lgli {
font-size: 0.875rem;
}
#fork-logview .f-lgsu {
display: flex;
}
#fork-logview .f-lgdt {
width: 9.5rem;
flex-shrink: 0;
}
#fork-logview .f-lgdts {
color: #F8F4E3;
background-color: #AA7939;
margin: 0.125rem 0.1875rem;
display: block;
text-align: center;
}
#fork-logview .f-lglv {
width: 5rem;
flex-shrink: 0;
}
#fork-logview .f-lglvs {
margin: 0.125rem 0.1875rem;
display: block;
text-align: center;
}
#fork #fork-logview summary.f-lgsu {
margin: 0;
}
#fork #fork-logview summary.f-lgsu::after {
content: none;
}
#fork-logview .f-lgdtl {
width: 100%;
}
#fork-logview .f-lgpre {
margin-top: 0.625rem;
overflow: auto;
}
/****************************************/
@media screen and (min-width: 81rem) {
#fork.f-with-nav {