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 de logs de Apache

Los logs de Apache (formato combinado) tienen una estructura precisa:

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

Un patrón con grupos nombrados extrae cada campo en una sola pasada:

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

Parece monstruoso, pero es la concatenación de patrones simples:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- el IPv4 de origen.
  • \s+\S+\s+\S+ -- los IDs de usuario (normalmente -).
  • \[[^\]]+\] -- la fecha entre corchetes.
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- la solicitud entre comillas, con el método HTTP, la ruta y la versión.
  • (?<status>\d+)\s+(?<size>\d+) -- el código de estado y los bytes enviados.

Estrategia general

  1. Empieza por la línea real y fija los delimitadores: espacios, comillas, corchetes.
  2. Entre delimitadores, identifica el tipo de token (IP, palabra, número).
  3. Encierra en grupos nombrados solo lo que necesites extraer.

Análisis de logs complejos

En el análisis de logs, los campos suelen estar separados por espacios, excepto cuando contienen cadenas entre comillas o corchetes (ej. el user-agent). El uso de clases de caracteres excluyentes en lugar del punto comodín evita que se fusionen varias columnas de forma incorrecta.

Pruébalo tú

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

Extrae el IPv4 al inicio de cada línea de log como un grupo nombrado `ip`.

Cargando editor...
Mostrar pista

Ancla al inicio de la línea con ^ y la flag m, y encierra la IP en (?<ip>...).

Solución disponible después de 3 intentos

Ejercicio de repaso

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

Extrae el método HTTP y la ruta de la solicitud entre comillas, como grupos `metodo` y `path`.

Cargando editor...
Mostrar pista

Empieza por ", luego (?<metodo>\w+)\s+(?<path>\S+).

Solución disponible después de 3 intentos

Desafío adicional

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

Extrae solo la parte de fecha y hora encerrada entre corchetes en los logs, ej. `10/Oct/2024:13:55:36 +0000`, como un grupo nombrado `timestamp`.

Cargando editor...
Mostrar pista

Usa \[(?<timestamp>[^\]]+)\] para evitar que el motor coincida más allá del corchete de cierre.

Solución disponible después de 3 intentos