Eu estou tentando buscar os logs nos últimos cinco minutos através de um script

1

Eu tenho um arquivo de log de saída que será anexado continuamente e estou planejando ter um script (executado a cada 5 min) para recuperar os últimos 5 min de dados do log de saída.

Dados de amostra do arquivo de log de saída:

2015-10-29 09:19:39,630 INFO line1 of log  
2015-10-29 09:21:39,630 INFO line2 of log
2015-10-29 09:22:39,630 INFO line3 of log
2015-10-29 09:23:39,630 INFO line4 of log
2015-10-29 09:24:39,630 INFO line5 of log
2015-10-29 09:25:39,630 INFO line6 of log

Se eu estiver executando meu script às 09:25, ele deve capturar as últimas 5 linhas e enviar para um arquivo de saída separado.

    
por rv krishna 06.12.2015 / 20:19

2 respostas

1

Isso é tudo que você precisa:

five_min=$( date -d "5 minutes ago" +"%F %T" )
while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done < output.log

Então, é um arquivo enorme. Em seguida, use tac para gerar o arquivo pela primeira vez:

five_min=$( date -d "5 minutes ago" +"%F %T" )
tac output.log | while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done | tac

O comando while , assim como outras linguagens, executa seu corpo enquanto a condição é verdadeira. Em shells POSIX, a "condição" dos comandos if e while é em si um comando. A "verdade" da "condição" é que o comando sai com um status de saída zero. É muito importante perceber que as palavras [ e [[ são realmente comandos, não apenas sintaxe (de um tipo de shell bash help [[ e help [ )

Nessa resposta, a condição é IFS= read -r line , que é a maneira canônica de ler uma linha de um arquivo e manter intactas todas as sequências de espaço em branco e de barra invertida. read retornará com um status de saída diferente de zero se não houver mais nada para ler em seu fluxo de entrada. Na minha primeira resposta, redirecionei o conteúdo do arquivo de log para a entrada padrão do comando while e read lerá esses dados.

    
por 06.12.2015 / 20:38
0
#!/bin/bash
#To get previous 5 minutes logs from now(IST)
d1=$(date –date="-5 min" +'%Y-%m-%d %H:%M:%S.%3N')
d2=$(date +'%Y-%m-%d %H:%M:%S.%3N') #Added missing closing parenthesis

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' /var/log/<file_name >  > /var/log/$<new_file_name>

Mais em: link

    
por 20.04.2017 / 18:02