Passer au contenu principal
eLearner.app
Module 8 · Leçon 2 sur 430/32 dans le cours~12 min
Leçons du module (2/4)

Analyseur de logs Apache

Les journaux Apache (format combiné) ont une structure précise :

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

Un motif avec des groupes nommés extrait chaque champ en une seule fois :

Code
^(?<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

  1. Partez de la ligne réelle et ciblez les délimiteurs : espaces, guillemets, crochets.
  2. Entre les délimiteurs, identifiez le type de jeton (IP, mot, nombre).
  3. 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

Exercice#regex.m8.l2.e1
Tentatives : 0Chargement…

Extrayez l'adresse IPv4 au début de chaque ligne de log en tant que groupe nommé `ip`.

Chargement de l'éditeur…
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

Exercice#regex.m8.l2.e2
Tentatives : 0Chargement…

Extrayez la méthode HTTP et le chemin de la requête entre guillemets, en tant que groupes `metodo` et `path`.

Chargement de l'éditeur…
Afficher l'indice

Commencez par ", puis (?<metodo>\w+)\s+(?<path>\S+).

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#regex.m8.l2.e3
Tentatives : 0Chargement…

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`.

Chargement de l'éditeur…
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