Entradas grep do arquivo de log dos últimos 30 min

2

Estou criando um script que enviará erros / avisos por e-mail a partir de um log. Eu gostaria de ter isso enviado a cada meia hora, mas eu só quero enviá-lo se houver uma nova entrada. Como eu conseguiria apenas a última meia hora de erros?

O registro de data e hora no log está no seguinte formato.

< Aug 1, 2016 2:15:29 PM MDT > < Detalhes do erro ..... >

O script até agora é:

#!/bin/bash
cat /var/log/logfile.log | egrep -i "error|warning" | tee -a /tmp/log.tmp

"get only last 30 min of errors" | mail -s "Errors/Warning" [email protected]

É possível converter os timestamps (1 de agosto de 2016 às 14h15min29s do horário MDT) para o horário da epoca e compará-los ao horário atual da época ou há um caminho com sed / awk / perl para obter a última data? 30 minutos?

    
por SpruceTips 05.08.2016 / 00:15

3 respostas

0

Grandes ideias, a mais simples é a sugestão de @MelBurslan para diferenciar os arquivos.

#!/bin/sh

[email protected]
OFILE=/var/tmp/alerts.tmp
LOG30=/var/tmp/LOG30
LOGNOW=/var/tmp/LOGNOW
HOST='hostname'

# setup file
if [ -f ${OFILE} ]; then
  cat /dev/null > ${OFILE}
else
  touch ${OFILE}
fi


cat /var/log/logfile.log | egrep -i "error|warning" | tee -a ${LOGNOW}

diff ${LOG30} ${LOGNOW} | tee -a ${OFILE}

if [ -f ${OFILE} ]; then
  echo "Errors" | cat - ${OFILE} > temp && mv temp ${OFILE}
  mailx -r [email protected] -s "Errors" ${MAILTO} < ${OFILE}
fi

rm ${LOG30}
mv ${LOGNOW} /var/tmp/LOG30
rm ${OFILE}
    
por 10.08.2016 / 00:57
2

Para converter para epoch, você pode usar a seguinte declaração:

# date +%s -d"Aug 1, 2016 2:15:29 PM MDT"
1470082529

Para converter a data em UTC, você pode usar:

# date -d @1470082529
Tue Aug  2 00:45:29 IRDT 2016  #### on Linux Box

# date -r 1470082529
Tue Aug  2 00:45:29 IRDT 2016 ###on BSD box
    
por 05.08.2016 / 02:01
1

Eu usaria o módulo perl do File::Tail . Eu não tenho tempo para escrever um exemplo agora, mas no perseudo pseudocódigo, seria algo como isto:

#! /usr/bin/not-actually-perl

use strict;
use File::Tail;

use Net::SMTP or Mail::Mailer or one of the squillion other
  perl mail sending modules;

open a File::Tail file handle to your log file

my $now=time();

my @lines = ();

while (read the File::Tail handle) {
  push @lines, $_;
  if (time() > ($now + 1800 seconds) ) {
    $now=time();
    email the @lines array to [email protected];
    @lines=();
  }
}

Um script de trabalho real provavelmente teria menos de 10 linhas a mais do que o acima, e a maior parte disso seria configurar os cabeçalhos para o e-mail.

e mais algumas linhas para capturar vários sinais para enviar por e-mail o que tem agora em @lines antes de suspender ou sair.

Veja as man pages de File::Tail e Net::SMTP (ou o que for) para detalhes exatos.

    
por 05.08.2016 / 16:44