2010-10-29 15 views
7

Estoy buscando un patrón de patrón de expresiones regulares para una cadena en HttpLogFormat. El registro está generado por haproxy. A continuación se muestra una cadena de muestra en este formato.Patrón Regex para analizar el formato HttpLog

Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1" 

Una explicación del formato está disponible en HttpLogFormat. Cualquier ayuda es apreciada.

Estoy tratando de obtener los pedazos de información individuales incluidos en esa línea. Estos son los campos:

  1. process_name '[' pid ']:'
  2. CLIENT_IP ':' client_port
  3. '[' accept_date ']'
  4. frontend_name
  5. backend_name '/' server
  6. Tq '/' Tw '/' TC '/' Tr '/' Tt *
  7. status_code
  8. bytes_read
  9. captured_request_cookie
  10. captured_response_cookie
  11. termination_state
  12. actconn '/' feconn '/' beconn '/' srv_conn '/' reintentos
  13. srv_queue '/' backend_queue
  14. '{' captured_request_headers * '}'
  15. '{' captured_response_headers * '}'
  16. ' "' http_request '"'
+1

¿Qué intentas analizar de esta línea? Una cosa es emparejarlo, otra cosa es obtener información particular de él. – eldarerathis

+0

Pero, ¿qué quieres obtener de la línea? – Keng

+1

Realmente depende de lo que quiere hacer coincidir. Toda la información, o solo parte de ella? – jordanbtucker

Respuesta

4

Regex:

^(\w+ \d+ \S+) (\S+) (\S+)\[(\d+)\]: (\S+):(\d+) \[(\S+)\] (\S+) (\S+)/(\S+) (\S+) (\S+) (\S+) *(\S+) (\S+) (\S+) (\S+) (\S+) \{([^}]*)\} \{([^}]*)\} "(\S+) ([^"]+) (\S+)" *$ 

Resultados:

Group 1: Feb 6 12:14:14 
Group 2: localhost 
Group 3: haproxy 
Group 4: 14389 
Group 5: 10.0.1.2 
Group 6: 33317 
Group 7: 06/Feb/2009:12:14:14.655 
Group 8: http-in 
Group 9: static 
Group 10: srv1 
Group 11: 10/0/30/69/109 
Group 12: 200 
Group 13: 2750 
Group 14: - 
Group 15: - 
Group 16: ---- 
Group 17: 1/1/1/1/0 
Group 18: 0/0 
Group 19: 1wt.eu 
Group 20: 
Group 21: GET 
Group 22: /index.html 
Group 23: HTTP/1.1 

yo uso RegexBuddy para componer expresiones regulares complejas.

+0

Gracias ... esto funcionó bastante bien. solo necesité algunos ajustes para manejar algunos escenarios personalizados. – Thimmayya

1

Parece una cadena muy complicada para combinar. Yo recomendaría usar una herramienta como Expresso. Comience con la cuerda que está tratando de unir y luego comience a reemplazar las piezas con la notación Regex.

Para tomar piezas individuales, use los paréntesis de agrupación.

La otra opción sería hacer una expresión regular para cada pieza que está tratando de agarrar.

2

Use at your own peril.

Esto supone que todos los campos devuelven algo a excepción de los que ha marcado con asteriscos (¿eso es lo que significa el asterisco)? También hay casos obvios de falla, como paréntesis anidados de cualquier tipo, pero si el registrador imprime mensajes razonablemente correctos, entonces supongo que estarás bien ...

Por supuesto, incluso yo personalmente no me gustaría tener para mantener esto, pero ahí lo tienes. En su lugar, puede considerar escribir un analizador ol ol habitual, si puede.

Editar: Marcado como CW ya que es más un tipo de respuesta "Me pregunto cómo va a salir" que cualquier otra cosa.Para tener una referencia rápida, esto es lo que terminó de construir en Rubular:

^[^[]+\s+(\w+)\[(\d+)\]:([^:]+):(\d+)\s+\[([^\]]+)\]\s+[^\s]+\s+(\w+)\/(\w+)\s+(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d*)\s+(\d+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)\s+(\d+)\/(\d+)\s+\{([^}]*)\}\s\{([^}]*)\}\s+\"([^"]+)\"$ 

Mi primer lenguaje de programación Perl era, e incluso estoy dispuesto a admitir que estoy asustado por eso.

+0

+1 ¡solo por sacar esa cosa desagradable! Lo probaré y actualizaré cómo funciona. – Thimmayya

+0

Gracias por la solución. Funciona bien en su mayor parte. La solución anterior de Mike funciona mejor y la expresión regular es más simple y más flexible. Usé rubular para ajustar la expresión regular y es una buena herramienta. – Thimmayya

0

No creo expresiones regulares es su mejor opción aquí ... sin embargo, si es su única opción ...

Trate de mirar estas opciones en su lugar. https://serverfault.com/q/62687/438

+0

¿Qué otras opciones sugiere? – Thimmayya

+0

@Thimmayya Creo que Splunk estaría en la parte superior de mi lista. http://www.splunk.com/ – Keng

1

Por qué estás tratando de partido la línea precisamente? Si está buscando campos específicos, mejor especifique cuáles y extráigalos. Si desea ejecutar estadísticas en los registros haproxy, debe echar un vistazo a la herramienta "halog" en el directorio "contrib" en las fuentes. Tome el de la versión 1.4.9, incluso sabe cómo ordenar las URL por tiempo de respuesta.

Pero lo que sea que quieras hacer con esas líneas, regex probablemente siempre sea la solución más lenta y compleja.

Cuestiones relacionadas