awk comando incapaz de ler o arquivo de log do apache (erro do usuário)

2

Perplexo com este:

menos, gato & grep são todos capazes de listar o conteúdo de um arquivo de log do apache "/var/log/apache2/other_vhosts_access.log". Mas quando eu uso o awk para pegar os últimos 5 minutos do arquivo, ele funciona ocasionalmente, mas na maioria das vezes não funciona. Nenhum erro foi dado, então como depurar este?

awk -v date="$(date --date='5 minutes ago' +"%d/%b/%Y:%T")" '$0~date {f=1}f' /var/log/apache2/other_vhosts_access.log >> /var/log/apache2/test/$(date +"%F_%T")_output.log

O awk tem problemas com o Apache gravando no arquivo ao tentar lê-lo? Seria melhor canalizar para awk de gato neste caso?

Minha abordagem inicial para pegar os últimos 5 minutos foi usar os timestamps no arquivo de log, além de algumas outras coisas, como endereço IP e contagem de bytes. Tudo porque várias entradas de log terão o mesmo timestamp. Possível, mas com código intensivo e difícil de determinar quando os logs são rotacionados.

A alternativa é contar e preservar o último número de linha de leitura (como um índice) do arquivo de log e na próxima execução, ler a partir daí até o final do arquivo e atualizar o índice. Ainda seria necessário registrar o timestamp da última corrida para verificar se não estamos lendo mais de 5 minutos de cada vez. O ponto é representar graficamente os dados, então prefiro perder dados e lidar com picos massivos que arruínam os gráficos.

A linha acima é muito mais simples, mas não sem seus próprios problemas. Como se verifica se não estamos duplicando dados ou dados perdidos acidentalmente? Tudo depende da capacidade do cron para executar em intervalos exatos de 300 segundos. Eu estava tentando testar isso, mas até agora o código acima não produz resultados. despejado em um arquivo executável e adicionado ao cron ainda não funcionou. Pelo menos no meu terminal funciona de vez em quando.

5 * * * * /var/log/apache2/simple.sh 2>&1 > /dev/null

Se eu estou indo sobre as coisas completamente erradas, por favor me avise. Eu encontrei algumas coisas sobre pegar os últimos x minutos de arquivos de log e nenhum parece resolver minhas preocupações listadas.

    
por dmgeurts 17.11.2015 / 18:51

1 resposta

2

Só descobri porque esse comando não funciona ... Se a data / hora não ocorrer no arquivo de log, o comando awk não corresponde a nada e não retorna nada ... Eu terei que ler o timestamp de cada linha, converta-o para epoch e compare se cai no intervalo em que estou interessado.

Ou, como sugerido pelo @Serg, reduza a sequência para corresponder ao eliminar os segundos. Isso não garante uma correspondência, mas aumenta a probabilidade. (ymmv)

    
por dmgeurts 17.11.2015 / 19:23