Parse Laravel исключение с помощью регулярных выражений - PullRequest
1 голос
/ 23 сентября 2019

Доброе время суток,
Я пытаюсь проанализировать журнал 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');
    }

1 Ответ

0 голосов
/ 23 сентября 2019

Вы можете попробовать это:

/((.*?),\scalled\sin\s(.*?)\son\sline\s(\d+).*?{"exception":.*?\((.*?)(?=(?:\(|\))))/gis
  • Группа 1: сообщение
  • Группа 2: in
  • группа 3: линия
  • группа 4: исключение

Проверьте это здесь: https://regex101.com/r/dZBb3K/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...