Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 2 de 430/32 en el curso~12 min
Lecciones del módulo (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

Ejercicio#regex.m8.l2.e1
Intentos: 0Cargando...

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

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos

Esercizio di ripasso

Ejercicio#regex.m8.l2.e2
Intentos: 0Cargando...

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

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos

Sfida aggiuntiva

Ejercicio#regex.m8.l2.e3
Intentos: 0Cargando...

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

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos