Pergunta

Estou procurando um Matcher de padrão Regex para uma string em Httplogformat. O log é gerado por Haproxy. Abaixo está uma string de amostra neste formato.

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"

Uma explicação do formato está disponível em Httplogformat. Qualquer ajuda é apreciada.

Estou tentando incluir as informações individuais das informações nessa linha. Aqui estão os campos:

  1. process_name '[' pid ']:'
  2. client_ip ':' client_port
  3. '[' aceit_date ']'
  4. Frontend_Name
  5. backend_name '/' server_name
  6. Tq '/' tw '/' tc '/' tr '/' tt*
  7. status_code
  8. bytes_read
  9. capturado_request_cookie
  10. CAPTURED_RESPONSE_COOKIE
  11. terminação_state
  12. actconn '/' feconn '/' becon '/' srv_conn '/'
  13. srv_queue '/' backend_queue
  14. '{' capturado_request_headers* '}'
  15. '{' CAPTURED_RESPONSE_HEADERS* '}'
  16. '"' http_request '"'
Foi útil?

Solução

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

eu uso Regexbuddy para compor expressões regulares complexas.

Outras dicas

Use por sua própria conta e risco.

Isso pressupõe que todos os campos retornam algo Exceto pelos que você marcou com asteriscos (é isso que o asterisco significa)? Também existem casos de falha óbvios, como suportes aninhados de qualquer tipo, mas se o madeireiro imprime mensagens razoavelmente sãs, acho que você ficaria bem ...

Claro, mesmo eu pessoalmente não gostaria de manter isso, mas aí está. Você pode considerar escrever um ol 'analiser regular para isso, se puder.

Editar: Marquei isso como CW, pois é mais um tipo de resposta "Eu me pergunto como isso acabará" do que qualquer outra coisa. Para referência rápida, foi isso que acabei construindo no 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+\"([^"]+)\"$

Minha primeira linguagem de programação foi Perl, e até estou disposto a admitir que estou com medo disso.

Parece uma string muito complicada para combinar. Eu recomendaria usar uma ferramenta como Expresso. Comece com a string que você está tentando combinar e comece a substituir as peças dela pela notação regex.

Para pegar peças individuais, use o agrupamento parênteses.

A outra opção seria fazer uma regex para cada peça que você está tentando pegar.

Por que você está tentando Combine a linha com precisão? Se você está procurando campos específicos, melhor especifique quais e os extraia. Se você deseja executar estatistitos nos logs do Haproxy, veja a ferramenta "Halog" no diretório "Contrib" nas fontes. Pegue o da versão 1.4.9, ele sabe como classificar os URLs por tempo de resposta.

Mas o que você quiser fazer com essas linhas, o Regex provavelmente sempre será a solução mais lenta e complexa.

Eu não acho que Regex seja sua melhor opção aqui ... no entanto, se for sua única opção ...

Tente olhar para essas opções.https://serverfault.com/q/62687/438

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top