Vai al contenuto
eLearner.app
Modulo 8 · Lezione 2 di 430/32 nel corso~12 min
Lezioni del modulo (2/4)

Parser di log Apache

I log Apache (formato combined) hanno una struttura precisa:

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

Un pattern con gruppi nominati estrae tutti i campi in un colpo:

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

Sembra mostruoso, ma e' la concatenazione di pattern semplici:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- l'IPv4 sorgente.
  • \s+\S+\s+\S+ -- gli ID utente (di solito -).
  • \[[^\]]+\] -- la data tra parentesi quadre.
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- la richiesta tra virgolette, con metodo HTTP, path e versione.
  • (?<status>\d+)\s+(?<size>\d+) -- status code e bytes inviati.

Strategia generale

  1. Parti dalla riga reale e fissa i delimitatori: spazi, virgolette, quadre.
  2. Tra delimitatori, identifica il tipo di token (IP, parola, numero).
  3. Avvolgi in gruppi nominati solo cio' che ti interessa estrarre.

Elaborazione di log complessi

Nel parsing di log, spesso i campi sono separati da spazi tranne quando contengono stringhe quotate o racchiuse da quadre (es. lo user-agent). Utilizzare classi escludenti anziché il punto jolly evita di unire erroneamente più colonne.

Prova tu

Esercizio#regex.m8.l2.e1
Tentativi: 0Caricamento…

Estrai l'IPv4 all'inizio di ogni riga di log come gruppo nominato `ip`.

Caricamento editor…
Mostra suggerimento

Ancora a inizio riga con ^ e flag m, e avvolgi l'IP in (?<ip>...).

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#regex.m8.l2.e2
Tentativi: 0Caricamento…

Estrai metodo HTTP e path della richiesta tra virgolette, come gruppi `metodo` e `path`.

Caricamento editor…
Mostra suggerimento

Apri con ", poi (?<metodo>\w+)\s+(?<path>\S+).

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#regex.m8.l2.e3
Tentativi: 0Caricamento…

Estrai solo la parte di data e ora racchiusa tra parentesi quadre nei log, es. `10/Oct/2024:13:55:36 +0000`, come gruppo nominato `timestamp`.

Caricamento editor…
Mostra suggerimento

Usa \[(?<timestamp>[^\]]+)\] per evitare che l'engine consumi altre quadre.

Soluzione disponibile dopo 3 tentativi