Analisando logs com awk

Tive que filtrar alguns logs de acesso do Apache e logs do servidor Rails para descobrir quais solicitações causaram um enorme aumento no uso de memória em um de nossos servidores de produção. Aqui estão algumas frases que me ajudaram a filtrar os dados:

Imprimir linhas em um determinado intervalo de tempo

awk '/01:05:/,/01:20:/' access.log

/start/, /end/ no awk ignora todas as linhas até encontrar uma que corresponda ao primeiro padrão e, em seguida, imprime todas as linhas até encontrar uma que corresponda ao padrão final.

Observe que, como isso é uma correspondência de texto simples, só funcionará se você realmente tiver acessos caindo nesses minutos. Se você tiver um site de baixo tráfego que não está recebendo acessos a cada minuto, precisará ajustar seus padrões para garantir que eles correspondam.

Imprimir linhas dentro de um determinado intervalo de tempo que correspondem a um padrão

awk '/01:05:/,/01:20:/ { if (/POST/) print }' access.log

Isso filtra o acima para imprimir apenas as linhas que contêm um texto específico.

Classifique o registro de acesso por tamanho de resposta (aumentando)

awk --re-interval '{ match($0, /(([^[:space:]]+|[[^]]+]|"[^"]+")[[:space:]]+){7}/, m); print m[2], $0 }' access.log|sort -nk 1

As especificações disso dependerão do formato do registro de acesso, mas a ideia básica é:

  1. Analise o campo de tamanho de resposta da linha.
  2. Anexe-o à linha (separado por um espaço).
  3. Classifique pelo tamanho prefixado.

O comando sort pode classificar por campo separado por espaço, portanto, em um mundo perfeito, poderíamos simplesmente passar o campo de classificação certo para um comando e pronto. Infelizmente, muitos formatos comuns de log de acesso incluem campos que podem conter espaços, então temos que quebrar algumas expressões regulares mais complexas.

  • [^[:space:]]+ corresponde a um ou mais caracteres sem espaço.
  • [[^]]+]corresponde a um ou mais caracteres (incluindo espaços) entre colchetes.
  • "[^"]+" corresponde a um ou mais caracteres (incluindo espaços) entre aspas duplas.
  • ([^[:space:]]+|[[^]]+]|"[^"]+") ORs juntos e correspondem a qualquer um dos acima, o que cobre todos os formatos de campo em meu log de acesso.
  • [[:space:]]+ corresponde a um ou mais espaços.
  • (([^[:space:]]+|[[^]]+]|"[^"]+")[[:space:]]+) os concatena, de modo que acabamos com um padrão que corresponde a um campo e a um espaço.
  • Adicionar ao final (e ao sinalizador) corresponde à sétima ocorrência de um campo seguida por um espaço em cada linha. Você provavelmente precisará ajustar isso para imprimir o campo correto para o formato do registro.{7}--re-interval
  • matchcasa o primeiro argumento ( $0– a linha atual) contra a expressão regular no segundo argumento e armazena as correspondências capturadas em uma matriz nomeada pelo terceiro argumento ( m).
  • m[2]imprime o segundo grupo capturado, contando os parênteses à esquerda. Nesse caso, isso significa o campo correspondente, sem os espaços à direita.
  • sort -nk 1 classifica numericamente no primeiro campo da entrada, em ordem crescente, para que as maiores solicitações fiquem no final.

Dependendo do que você tem em seu log de acesso, você pode usar isso em outros valores também, como tempo de resposta.