Доброе время суток,
Я пытаюсь проанализировать журнал Laravel на предмет исключений (и других типов сообщений) с помощью JackieDo / Laravel-Log-Reader , однако естьпроблема с получением данных об исключении.
Входная строка:
Argument 1 passed to App\Classes\Storage\AbstractStorage::formatBytes() must be of the type int, null given, called in /app/app/Classes/Storage/PlexStorage.php on line 152 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Argument 1 passed to App\\Classes\\Storage\\AbstractStorage::formatBytes() must be of the type int, null given, called in /app/app/Classes/Storage/PlexStorage.php on line 152 at /app/app/Classes/Storage/AbstractStorage.php:88)
И результирующий массив должен выглядеть следующим образом (или что-то в этом духе):
[
'message' => 'Argument 1 passed to App\\Classes\\Storage\\AbstractStorage::formatBytes() must be of the type int, null given',
'exception' => 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError',
'in' => '/app/app/Classes/Storage/PlexStorage.php',
'line' => 152
]
Однако, регулярное выражение, которое создается следующим фрагментом кода:
$pattern = "/^" . self::CONTEXT_EXCEPTION_PATTERN . self::CONTEXT_MESSAGE_PATTERN . self::CONTEXT_IN_PATTERN . "$/ms";
preg_match($pattern, $content, $matches);
Где:
const CONTEXT_EXCEPTION_PATTERN = "exception\s\'{1}([^\']+)\'{1}";
const CONTEXT_MESSAGE_PATTERN = "(\swith\smessage\s\'{1}(.*)\'{1})?";
const CONTEXT_IN_PATTERN = "\sin\s(.*)\:(\d+)";
И результат выполнения этого фрагмента кода:
/^exception\s\'{1}([^\']+)\'{1}(\swith\smessage\s\'{1}(.*)\'{1})?\sin\s(.*)\:(\d+)$/ms
не работает (совпадения всегда пусты).
Я даже не близок к тому, чтобы работать с такого рода строками регулярных выражений (могу писать только простые строчки регулярных выражений), поэтому любая помощь в решении этой проблемы действительно приветствуется.
PS Не думаю, что спрашивать разработчика - это хорошая идея, так как проект, похоже, заброшен (последнее обновление почти год назад, но основная часть пакета работает просто отлично.
PPS Это полный метод для извлечения необходимой информации из журнала
public function parseLogContext(string $context): array {
$content = trim($context);
$pattern = "/^" . self::CONTEXT_EXCEPTION_PATTERN . self::CONTEXT_MESSAGE_PATTERN . self::CONTEXT_IN_PATTERN . "$/ms";
preg_match($pattern, $content, $matches);
$exception = isset($matches[1]) ? $matches[1] : null;
$message = isset($matches[2]) ? $matches[3] : $content;
$in = isset($matches[4]) ? $matches[4] : null;
$line = isset($matches[5]) ? $matches[5] : null;
return compact('message', 'exception', 'in', 'line');
}