Maneiras de analisar arquivos de log baseados em combinação NCSA

Maneiras de analisar arquivos de log baseados em combinação NCSA

Pesquisei um pouco site:no Google sobre Server Fault, Super User e Stack Overflow. Também verifiquei resultados não específicos do site e não vi uma pergunta como essa, então aqui vai...

eu localizeiesta questão, relacionada ao grep e awkque tem muito conhecimento, mas não acho que o desafio de qualificação do texto tenha sido abordado. Esta questão também amplia o escopo para qualquer plataforma e qualquer programa.

Eu tenho logs do squid ou apache baseados no formato combinado NCSA. Quando digo baseado, o que significa que as primeiras n colunas no arquivo são de acordo com os padrões combinados da NCSA, pode haver mais colunas com itens personalizados.

Aqui está um exemplo de linha de um log combinado do squid:

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

Gostaria de poder analisar nlogs e gerar colunas específicas, para classificar, contar, encontrar valores exclusivos, etc.

O principal desafio e o que o torna um pouco complicado e também o motivo pelo qual sinto que esta pergunta ainda não foi feita ou respondida, é oenigma de qualificação de texto.

Quando eu avisteiSQLda pergunta grep/awk, fiquei muito animado, mas depois percebi que ele não suportava combinação pronta para uso, algo que tentarei estender, eu acho.

Ansioso por respostas e aprendendo coisas novas! As respostas não precisam ser limitadas à plataforma ou programa/linguagem. Para o contexto desta questão, as plataformas que mais utilizo são Linux ou OSX.

Saúde

Responder1

Usando Perl, testado em v5.10.0 criado para darwin-thread-multi-2level (OSX)

Para imprimir a coluna UserAgent:

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • opção -nenquanto cada linha emtest.log
  • opção -eprograma de uma linha

Eu roubei e ajustei o perlre que pesquisei no Googledo livro de receitas do PHP. Removi o $final do re para oferecer suporte a formatos personalizados baseados em NCSA combinados. O padrão pode ser facilmente estendido para fornecer mais grupos.

Os grupos de expressões regulares ()acabam como variáveis ​​locais $1para$n

Rápido e sujo e muito fácil de estender e criar scripts.

Alguns exemplos de canalização da saída:

  • | sort | uniqvalores de coluna exclusivos
  • | sort | uniq | wc -lcontagem única de colunas

Críticas e melhorias são bem-vindas

Responder2

Embora não aborde diretamente a qualificação de texto, um fator que pode ser aproveitado no formato combinado é que as colunas restantes delimitadas por espaço estão consistentemente na mesma coluna. Você pode, portanto, contornar o problema usando um loop com printf e NF (número de colunas)

De acordo com o awk, $0 é a linha de entrada inteira, $1 é a primeira coluna, $2 é a segunda e $NF é a última.

Portanto, para um NCSA padrão combinado, o agente do usuário vai das colunas $ 13 até a coluna $ NF

Precisei remover a primeira coluna e trocá-la pela última coluna de um formato de log modificado (o IP proxy foi adicionado à última coluna).

Então o que deveria ser retornado era a coluna $NF, seguida pela segunda coluna ($2), e depois as colunas restantes até NF - 1

Consegui fazer isso com o seguinte: -

awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log

informação relacionada