$m[1], 'level' => strtolower($m[2]), 'message' => $m[3], 'channel' => $ch, ]; if ($level !== '' && $entry['level'] !== $level) { continue; } if ($q !== '' && stripos($line, $q) === false) { continue; } $entries[] = $entry; } } // Новые сверху (datetime сравним лексикографически). usort($entries, static fn($a, $b) => strcmp($b['datetime'], $a['datetime'])); return array_slice($entries, 0, $this->limit); } /** * {@inheritDoc} */ public function dates(): array { $dir = Log::directory(); if (!is_dir($dir)) { return []; } $files = array_merge( glob($dir . '/action-*.log') ?: [], glob($dir . '/error-*.log') ?: [] ); $dates = []; foreach ($files as $file) { if (preg_match('/-(\d{4}-\d{2}-\d{2})\.log$/', $file, $m)) { $dates[$m[1]] = true; } } $dates = array_keys($dates); rsort($dates); // новые даты сверху return $dates; } }