Direct naar de hoofdinhoud
Module 8 · Les 2 van 430/32 in de cursus~12 min
Modulelessen (2/4)

Apache-logparser

Apache-logboeken (gecombineerd formaat) hebben een precieze structuur:

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

Een patroon met benoemde groepen extraheert elk veld in één keer:

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+)

Het ziet er monsterlijk uit, maar het is de aaneenschakeling van eenvoudige patronen:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- de bron-IPv4.
  • \s+\S+\s+\S+ -- de gebruikers-ID's (meestal -).
  • \[[^\]]+\] -- de datum tussen vierkante haken.
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- het verzoek tussen aanhalingstekens, met HTTP-methode, pad en versie.
  • (?<status>\d+)\s+(?<size>\d+) -- statuscode en bytes verzonden.

Algemene strategie

  1. Begin vanaf de echte regel en zet de scheidingstekens vast: spaties, aanhalingstekens, haakjes.
  2. Identificeer tussen scheidingstekens het type token (IP, woord, nummer).
  3. Verpak alleen datgene in benoemde groepen dat u wilt extraheren.

Complexe logboeken parseren

Bij het parseren van logboeken worden velden gewoonlijk door spaties gescheiden, behalve wanneer ze tekenreeksen tussen aanhalingstekens of haakjes bevatten (bijvoorbeeld de user-agent). Het gebruik van uitsluitingskarakterklassen in plaats van de jokerteken voorkomt dat meerdere kolommen verkeerd worden samengevoegd.

Probeer het

Oefening#regex.m8.l2.e1
Pogingen: 0Laden…

Extraheer de IPv4 aan het begin van elke logregel als een benoemde groep `ip`.

Editor laden…
Toon hint

Veranker aan het begin van de regel met ^ en de m-vlag, en wikkel het IP-adres in (?<ip>...).

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#regex.m8.l2.e2
Pogingen: 0Laden…

Extraheer de HTTP-methode en het pad van het verzoek tussen aanhalingstekens, als groepen `metodo` en `path`.

Editor laden…
Toon hint

Open met " en vervolgens (?<metodo>\\w+)\\s+(?<pad>\\S+).

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#regex.m8.l2.e3
Pogingen: 0Laden…

Extract only the date and time part enclosed in brackets in logs, e.g. `10/Oct/2024:13:55:36 +0000`, as a named group `timestamp`.

Editor laden…
Toon hint

Use \[(?<timestamp>[^\]]+)\] to prevent the engine from matching past the closing bracket.

Oplossing beschikbaar na 3 pogingen