PHP анализ файла журнала по регулярному выражению - PullRequest
0 голосов
/ 22 января 2020

Я проанализировал журналы из файла журнала, используя php, и поместил эти строки в массив.

[2020-01-21 18:01:23] local.INFO: Backup success
[2020-01-21 18:11:03] local.DEBUG: aid=1 bac=2343
[2020-01-21 18:21:29] production.CRITICAL:send failed
[2020-01-21 18:51:01] production.WARNING:limit 7/9 reached

из каждой строки, как я могу получить ожидаемый результат более эффективно?

$final = [];
foreach($lines as $line){
    //best way to parse data to $date, $env, $type, $message from $line variable?

    $arr = [
        'date'=> $date,
        'env'=> $env,
        'type'=> $type,
        'message'=> $message
    ];
    array_push($final, $arr);
}

Ожидание

[
    {
        "date":"2020-01-21 18:01:23",
        "env":"local",
        "type":"INFO",
        "message":"Backup success"
    },
    {
        "date":"2020-01-21 18:21:29",
        "env":"production",
        "type":"CRITICAL",
        "message":"send failed"
    },
    ...
    ...
]

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Попробуйте эту версию.

$re = '/^\[(?<date>.*)\]\s(?<env>\w+)\.(?<type>\w+):(?<message>.*)/m';

$str = '[2020-01-21 18:01:23] local.INFO: Backup success
[2020-01-21 18:11:03] local.DEBUG: aid=1 bac=2343
[2020-01-21 18:21:29] production.CRITICAL:send failed
[2020-01-21 18:51:01] production.WARNING:limit 7/9 reached';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

// Print json string
echo json_encode($matches, JSON_PRETTY_PRINT);

0 голосов
/ 22 января 2020

Смесь взрывов, подстрок, обрезки и разрушения массива:

$final = [];
foreach ($lines as $line) {
    [$envType, $message] = explode(':', substr($line, 22));
    [$env, $type] = explode('.', $envType);

    $final[] = [
        'date'    => substr($line, 1, 19),
        'env'     => $env,
        'type'    => $type,
        'message' => trim($message)
    ];
}

$jsonFormat = json_encode($final, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
0 голосов
/ 22 января 2020

Надеюсь, это решит ваш ответ на вопрос:)

$lines = '[2020-01-21 18:01:23] local.INFO: Backup success';
$arr = explode('] ', $lines);
$arr1 = explode(': ', $arr[1]);
$arr2 = explode('.', $arr1[0]);
$arr[0] = str_replace("[","",$arr[0]);
echo 'date = ' . $arr[0];
echo '<br>';
echo 'env = ' .$arr2[0];
echo '<br>';
echo 'type = ' .$arr2[1];
echo '<br>';
echo 'message = ' .$arr1[1];
echo '<br>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...