Leçons du module (2/4)
Analyseur de logs Apache
Les journaux Apache (format combiné) ont une structure précise :
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234Un motif avec des groupes nommés extrait chaque champ en une seule fois :
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)Cela semble monstrueux, mais c'est la concaténation de motifs simples :
(?<ip>\d+\.\d+\.\d+\.\d+)-- l'adresse IPv4 source.\s+\S+\s+\S+-- les identifiants utilisateur (généralement-).\[[^\]]+\]-- la date entre crochets."(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"-- la requête entre guillemets, avec la méthode HTTP, le chemin et la version.(?<status>\d+)\s+(?<size>\d+)-- le code d'état et les octets envoyés.
Stratégie générale
- Partez de la ligne réelle et ciblez les délimiteurs : espaces, guillemets, crochets.
- Entre les délimiteurs, identifiez le type de jeton (IP, mot, nombre).
- Enveloppez dans des groupes nommés uniquement ce que vous devez extraire.
Analyse de journaux complexes
Dans l'analyse de logs, les champs sont généralement séparés par des espaces, sauf lorsqu'ils contiennent des chaînes entre guillemets ou des crochets (ex. le user-agent). L'utilisation de classes de caractères d'exclusion au lieu du point générique empêche de faire correspondre plusieurs colonnes de manière incorrecte.
À vous de jouer
Extrayez l'adresse IPv4 au début de chaque ligne de log en tant que groupe nommé `ip`.
Afficher l'indice
Ancrez au début de la ligne avec ^ et le drapeau m, et enveloppez l'IP dans (?<ip>...).
Solution disponible après 3 tentatives
Exercice de révision
Extrayez la méthode HTTP et le chemin de la requête entre guillemets, en tant que groupes `metodo` et `path`.
Afficher l'indice
Commencez par ", puis (?<metodo>\w+)\s+(?<path>\S+).
Solution disponible après 3 tentatives
Défi supplémentaire
Extrayez uniquement la partie date et heure délimitée par des crochets dans les journaux, par exemple `10/Oct/2024:13:55:36 +0000`, sous forme de groupe nommé `timestamp`.
Afficher l'indice
Utilisez \[(?<timestamp>[^\]]+)\] pour empêcher le moteur de chercher des correspondances au-delà du crochet fermant.
Solution disponible après 3 tentatives