Position actuelle: Accueil> Derniers articles> Format unifié de l'IP, du temps et d'autres champs dans le fichier journal

Format unifié de l'IP, du temps et d'autres champs dans le fichier journal

M66 2025-05-18

Lors du traitement des fichiers journaux du serveur, nous rencontrons souvent des problèmes avec des formats incohérents. Par exemple, l'adresse IP peut avoir des zéros de premier plan, le format horodatage peut être incohérent et le chemin de demande peut avoir divers paramètres. Afin de gérer ces champs uniformément, preg_replace_callback_array est un outil très puissant qui nous permet de lier séparément différentes fonctions de rappel à plusieurs expressions régulières et de terminer la logique de remplacement complexe dans une traversée.

Cet article présentera comment utiliser preg_replace_callback_array pour formater uniformément les champs IP et Time dans le journal.

Exemple de format de journal

Supposons que nous ayons le contenu du journal suivant (version simplifiée):

 127.000.000.001 - - [21/Apr/2025:15:32:01 +0000] "GET /index.php?id=123 HTTP/1.1" 200
192.168.1.10 - - [21-Apr-2025 15:32:01] "POST /submit.php HTTP/1.1" 404

Nous espérons:

  • Normaliser l'adresse IP (supprimer les zéros principaux);

  • Unifiez le temps dans le format Yyyy-mm-dd HH: MM: SS ;

  • Facultatif: Masque Paramètres dans le chemin, par exemple /Index.php?id=123/Index.php

Implémentation à l'aide de preg_replace_callback_array

 <?php

$log = <<<LOG
127.000.000.001 - - [21/Apr/2025:15:32:01 +0000] "GET /index.php?id=123 HTTP/1.1" 200
192.168.1.10 - - [21-Apr-2025 15:32:01] "POST /submit.php HTTP/1.1" 404
LOG;

// Définir des rappels de traitement réguliers et correspondants
$patterns = [
    // IP Formatage d&#39;adressage:Supprimer les zéros de tête
    '/\b(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\b/' => function ($matches) {
        return implode('.', array_map('intval', array_slice($matches, 1, 4)));
    },

    // Apache Horodatage de style [21/Apr/2025:15:32:01 +0000]
    '/\[(\d{2})\/(\w{3})\/(\d{4}):(\d{2}):(\d{2}):(\d{2}) [+\-]\d{4}\]/' => function ($matches) {
        $monthMap = [
            'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
            'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
            'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12'
        ];
        return sprintf('%s-%s-%s %s:%s:%s',
            $matches[3],                         // Année
            $monthMap[$matches[2]] ?? '01',     // lune
            $matches[1],                         // jour
            $matches[4], $matches[5], $matches[6]
        );
    },

    // jour志格式中另一种时间 [21-Apr-2025 15:32:01]
    '/(\d{2})-(\w{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2})/' => function ($matches) {
        $monthMap = [
            'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
            'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
            'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12'
        ];
        return sprintf('%s-%s-%s %s:%s:%s',
            $matches[3],
            $monthMap[$matches[2]] ?? '01',
            $matches[1],
            $matches[4], $matches[5], $matches[6]
        );
    },

    // Retirer URL paramètre(comme /index.php?id=123 → /index.php)
    '#(GET|POST|PUT|DELETE|HEAD) (/[\w\-\/\.]+)(\?[^\s"]*)?#' => function ($matches) {
        return $matches[1] . ' ' . $matches[2];
    }
];

// Remplacement de l&#39;application
$formatted = preg_replace_callback_array($patterns, $log);

// Résultat de sortie
echo nl2br(htmlspecialchars($formatted));
?>

Résultat de sortie

Après avoir exécuté le script ci-dessus, le contenu du journal sera formaté comme:

 127.0.0.1 - - 2025-04-21 15:32:01 "GET /index.php HTTP/1.1" 200  
192.168.1.10 - - 2025-04-21 15:32:01 "POST /submit.php HTTP/1.1" 404

résumé

Avec preg_replace_callback_array, nous sommes en mesure de gérer plusieurs champs dans différents formats dans le journal de manière très élégante. Son avantage est qu'il gère plusieurs modes à la fois, chaque mode a sa propre fonction de rappel indépendamment, ce qui a une logique claire et une maintenance facile.