pesquisa no log da última hora

0

Eu preciso do script bash para procurar nas palavras de log Failed e failure. Mas só da última hora

cut -c 5- /var/log/mail.log | awk '($0 >= from)' from="$(LC_TIME=C date +'%_d %H:%M:%S' -d -1hour)" |grep -i 'Failed:\|failure'

Exemplo de arquivo de log

Nov  1 01:00:00 localhost pushmail[55555]: 666666666666: Failed 
Nov  2 15:00:00 localhost pushmail[55556]: 666666666666: Failed 
Nov  3 11:00:00 localhost pushmail[55557]: 666666666666: Failed 
Nov  3 12:00:00 localhost pushmail[55558]: 666666666666: Failed 
Nov  3 13:30:00 localhost pushmail[55559]: 666666666666: Failed 
Nov  3 13:40:00 localhost pushmail[55560]: 666666666666: Failed 
Nov  3 14:00:00 localhost pushmail[55561]: 666666666666: Failed 
Nov  3 15:00:00 localhost pushmail[55562]: 666666666666: Failed 
Nov 14 15:00:00 localhost pushmail[55563]: 666666666666: Failed 

Eu uso o corte para remover o nome do mês local. Mas quando eu tenho em forma de entrada de log dois dias atrás eu tenho isso em resultados.

    
por MiKo 03.11.2017 / 13:04

3 respostas

0

awk '($ 0 > = from)' de="$ (LC_ALL = C date + '% b% _d% H:% M:% S' -d -1hora)" ~ / mail.log | grep -i 'Falha \ | falha'

Oi! Obrigado a todos pela ajuda! No meu caso, esse script funciona. Se você quiser alterar o intervalo de tempo a partir de 1 hora, você pode fazer esse exemplo de valor chcenaging -d -60minutes ou -d -2days

    
por 16.11.2017 / 11:51
1

A solução mais confiável que pude encontrar é:

while read -r rec
do   age=$(($(date +%s)-$(date -d "${rec:0:16}" +%s)))
     [ $age -ge 0 -a $age -le 3600 ] && \
     grep -Eiq 'failed|failure' <<< "$rec" && echo "$rec"
done </var/log/mail.log

Isso usa date para converter os tempos registrados em segundos desde o início de 1970 e, em seguida, os compara com o valor de segundos da hora atual. Isso funcionará em todos os casos, incluindo a hora após a meia-noite, exceto a primeira hora de um ano novo, porque date -d é padronizado para o ano atual quando nenhum é especificado. Eu suponho que você terá coisas melhores para fazer do que executar este script no início de um novo ano.

A verificação para a idade recorde não-negativa elimina registros futuros, como encontrei no registro de 14 de novembro, quando testei em 3 de novembro. Eu simulei chamadas em tempos diferentes, adicionando um parâmetro -d à primeira chamada date , que na resposta obtém a referência de hora atual.

    
por 04.11.2017 / 01:00
0

O problema é que "14">" 3" porque 1 > "". Você precisa usar zeros à esquerda em suas datas. Por exemplo, você pode colocar todos os comandos em um awk:

awk '{ date = sprintf("%02d %s",$2,$3) }
     date>from && /Failed|failure/ { print }
' from="$(LC_TIME=C date +'%d %H:%M:%S' -d -1hour)"

Alterei o %_d para %d para obter zeros à esquerda a partir da data. No awk, o sprintf usa %02d para colocar um zero à esquerda no campo 2, a data.

    
por 03.11.2017 / 15:48