Formas de analisar arquivos de log combinados baseados no NCSA

3

Fiz um pouco de site: pesquisando com o Google no Server Fault, Super User e Stack Overflow. Eu também verifiquei resultados não específicos do site e realmente não vi uma pergunta como essa, então aqui vai ...

Eu localizei essa questão, relacionada ao grep e ao awk , que tem um grande conhecimento, mas não sinto que o desafio da qualificação do texto foi abordado. Esta questão também amplia o escopo para qualquer plataforma e qualquer programa.

I've got squid or apache logs based on the NCSA combined format. When I say based, meaning the first n col's in the file are per NCSA combined standards, there might be more col's with custom stuff.

Aqui está uma linha de exemplo de um log combinado de lula:

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

I'd like to be able to parse n logs and output specific columns, for sorting, counting, finding unique values etc

O principal desafio e o que o torna um pouco complicado, e também porque eu sinto que essa pergunta ainda não foi perguntada ou respondida, é o enigma da qualificação do texto .

Quando vi asql da pergunta grep / awk, fiquei muito animado, mas depois percebi que não suportou combinado fora da caixa, algo que eu vou olhar estendendo eu acho.

Aguardando respostas e aprendendo coisas novas! As respostas não precisam estar limitadas a plataforma ou programa / idioma. Para o contexto desta questão, as plataformas que mais uso são Linux ou OSX.

Felicidades

    
por Kyle 21.12.2010 / 19:47

2 respostas

3

Usando o Perl, testado no v5.10.0 construído para o darwin-thread-multi-2level (OSX)

To print the UserAgent column:

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

Eu roubei e alterei o perlre que eu pesquisei no livro de receitas do PHP . Eu removi o $ do final do re para suportar formatos personalizados baseados no NCSA combinado. O padrão pode ser facilmente estendido para fornecer mais grupos.

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

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

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

  • | sort | uniq valores de coluna exclusivos
  • | sort | uniq | wc -l contagem de colunas única

Crítica e melhorias bem-vindas

    
por 21.12.2010 / 20:14
1

Embora não aborde diretamente a qualificação de texto, um fator que pode ser aproveitado no formato combinado é que as colunas delimitadas por espaço restante 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 awk, $ 0 é toda a linha de entrada, $ 1 é a primeira coluna, $ 2 é a segunda e $ NF é a última.

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

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

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

Eu 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
    
por 13.08.2011 / 12:04