Posso usar analisadores de log, mas geralmente preciso analisar logs da web recentes para ver o que está acontecendo no momento.
Às vezes faço coisas como descobrir os 10 principais ips que solicitam um determinado arquivo
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
O que você tem na sua caixa de ferramentas?
Você pode fazer praticamente qualquer coisa com arquivos de log do apache apenas com o awk. Os arquivos de log do Apache são basicamente separados por espaços em branco e você pode fingir que as aspas não existem e acessar qualquer informação de seu interesse pelo número da coluna. A única vez que isso é interrompido é se você tiver o formato de log combinado e estiver interessado em agentes do usuário, nesse ponto você terá que usar aspas ("") como separador e executar um comando awk separado. A seguir, você verá os IPs de cada usuário que solicita a página de índice classificada pelo número de acessos:
$ 7 é o URL solicitado. Você pode adicionar quaisquer condições que desejar no início. Substitua o '$7 == "/" por qualquer informação que você queira.
Se você substituir $1 in (ipcount[$1]++), poderá agrupar os resultados por outros critérios. Usar $7 mostraria quais páginas foram acessadas e com que frequência. É claro que você gostaria de alterar a condição no início. O seguinte mostraria quais páginas foram acessadas por um usuário de um IP específico:
Você também pode canalizar a saída por meio de classificação para obter os resultados em ordem, como parte do comando shell ou também no próprio script awk:
O último seria útil se você decidisse expandir o script awk para imprimir outras informações. É tudo uma questão do que você quer descobrir. Estes devem servir como ponto de partida para o que você estiver interessado.
Uma coisa que eu nunca vi ninguém fazer, por razões que não consigo imaginar, é mudar o formato do arquivo de log do Apache para uma versão mais facilmente analisável com as informações que realmente importam para você.
Por exemplo, nunca usamos autenticação básica HTTP, portanto, não precisamos registrar esses campos. Estou interessado em quanto tempo cada solicitação leva para ser atendida , então vamos adicionar isso. Para um projeto, também queremos saber (em nosso balanceador de carga) se algum servidor está atendendo a solicitações mais lentas do que outros, então registramos o nome do servidor para o qual estamos fazendo proxy.
Aqui está um trecho da configuração do apache de um servidor:
O que você realmente não pode dizer disso é que entre cada campo há um caractere de tabulação literal (\t). Isso significa que se eu quiser fazer alguma análise em Python, talvez mostrar status não 200 por exemplo, posso fazer isso:
Ou se eu quisesse fazer 'quem está fazendo hotlinking de imagens?' seria
Para contagens de IP em um log de acesso, o exemplo anterior:
fica algo assim:
Mais fácil de ler e entender e muito menos caro computacionalmente (sem regex), o que, em logs de 9 GB, faz uma enorme diferença em quanto tempo leva. Quando isso fica REALMENTE legal é se você quiser fazer a mesma coisa para os agentes do usuário. Se seus logs são delimitados por espaço, você precisa fazer alguma correspondência de expressão regular ou pesquisa de string manualmente. Com este formato, é simples:
Exatamente igual ao anterior. Na verdade, qualquer resumo que você queira fazer é basicamente o mesmo.
Por que diabos eu gastaria a CPU do meu sistema em awk e grep quando cut fará exatamente o que eu quero ordens de magnitude mais rápido?
Esqueça o awk e o grep. Confira asql . Por que escrever scripts ilegíveis quando você pode usar sql como sintaxe para consultar o arquivo de log. Por exemplo.
Aqui está um script para encontrar os principais URLs, principais referenciadores e principais agentes do usuário das entradas de log N recentes
Fonte
para contagens de IP em um log de acesso:
É um pouco feio, mas funciona. Eu também uso o seguinte com netstat (para ver conexões ativas):
Eles são alguns dos meus "one forros" favoritos :)
Aqui meu exemplo 'sed', ele lê o formato padrão dos logs do apache e o converte em algo mais conveniente para processamento automático. A linha inteira é definida como expressão regular, as variáveis são salvas e gravadas na saída com '#' como separador.
A notação simplificada da entrada é: %s %s %s [%s] "%s" %s %s "%s" "%s"
Exemplo de linha de entrada: xx.xx.xx.xx - - [29/Mar/2011:12:33:02 +0200] "GET /index.html HTTP/1.0" 200 9443 "-" "Mozilla/4.0"
Exemplo de linha de saída: xx.xx.xx.xx#-#-#29/Mar/2011:12:33:02 +0200#GET /index.html HTTP/1.0#200#9443#-#Mozilla/4.0
Sinta o poder das expressões regulares :-)
Construir uma lista de perguntas comuns seria um ótimo índice para essas respostas a essa pergunta. Minhas dúvidas comuns são:
Percebo essas mudanças monitorando as páginas de status do servidor (via mod_status) para taxa de acertos e tempo de resposta aproximado para solicitações ativas e concluídas recentemente (sabendo muito bem que sinto falta de uma enorme pilha de dados, mas as amostras são boas o suficiente).
Eu uso a seguinte diretiva LogFormat (o %T é realmente útil)
Estou procurando causa-efeito e o que aconteceu primeiro... geralmente sobre subconjuntos específicos de padrões em meus logs, então preciso saber o seguinte para qualquer padrão/expressão regular:
Eu geralmente uso perl, porque eventualmente fica complexo o suficiente para valer a pena.
Um exemplo não-perl seria uma taxa de acerto rápida por minuto para códigos de status não 200:
Sim, estou trapaceando com esse grep, presumindo que um espaço de aspas-200-espaço corresponda apenas a códigos de status http .... poderia usar awk ou perl para isolar o campo, lembre-se de que pode ser impreciso.
Um exemplo mais complexo em perl pode ser visualizar uma mudança na taxa de acerto de um padrão.
Há muito o que mastigar no script abaixo, especialmente se você não estiver familiarizado com perl.
código segue:
Se você deseja apenas processar métricas padrão, faça o checkout
Quem está linkando suas imagens:
Eu uso muito o awk dando tailing ou cat'ing o arquivo. Toda noite eu me entrego um relatório da web para cada servidor. Dependendo do seu arquivo de log e do seu LogFormat, você precisará editar alguns dos liners para trabalhar para você.. .
Aqui está um exemplo simples:
Se eu quiser seguir os logs no meu servidor para apenas códigos de status 404/500, eu faria isso:
<recorte>
< /recorte>
A coisa que eu costumo fazer na maioria das vezes é ler seções de um log com base no tempo, então escrevi o seguinte script usando sed para extrair o período em que estou interessado, funciona em todos os arquivos de log que eu vim e também pode lidar com os logs arquivados.