Lezioni del modulo (2/4)
Parser di log Apache
I log Apache (formato combined) hanno una struttura precisa:
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234Un pattern con gruppi nominati estrae tutti i campi in un colpo:
^(?<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
- Parti dalla riga reale e fissa i delimitatori: spazi, virgolette, quadre.
- Tra delimitatori, identifica il tipo di token (IP, parola, numero).
- 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
Estrai l'IPv4 all'inizio di ogni riga di log come gruppo nominato `ip`.
Mostra suggerimento
Ancora a inizio riga con ^ e flag m, e avvolgi l'IP in (?<ip>...).
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Estrai metodo HTTP e path della richiesta tra virgolette, come gruppi `metodo` e `path`.
Mostra suggerimento
Apri con ", poi (?<metodo>\w+)\s+(?<path>\S+).
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
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`.
Mostra suggerimento
Usa \[(?<timestamp>[^\]]+)\] per evitare che l'engine consumi altre quadre.
Soluzione disponibile dopo 3 tentativi